【问题标题】:django ValueError Cannot query "abcd@gmail.com": Must be "object" instancedjango ValueError 无法查询“abcd@gmail.com”:必须是“对象”实例
【发布时间】:2020-10-19 16:13:27
【问题描述】:

我正在尝试为学生制作应用程序,但出现此错误, 如您所见,为了方便起见,我想像下面展示的那样使用它,但是它不起作用,我应该像以前一样继续使用吗?或者我可以这样使用?最好的方法是什么?

/student/program_structure/ 处的值错误 无法查询“abcd@gmail.com”:必须是“学生”实例。

非常感谢:)

models.py

class Student(models.Model):
    user = models.ForeignKey(
          settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    status = models.CharField(max_length=10, choices=STATUS, default='active')
 
 
class Program(models.Model):
        
         #everything was fine when used 

    user = models.ForeignKey(
          settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)  #this one

         #but when using this one i started getting this error from views.py 

    user = models.ForeignKey(
                  Student, on_delete=models.SET_NULL, null=True)

    name = models.CharField(max_length=200, unique=True)
    prefix = models.CharField(max_length=20)


class Course(models.Model):
    user = models.ForeignKey(Student, on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=200, unique=True)
    prefix = models.CharField(max_length=20)
    code = models.CharField(max_length=20)

   subject = models.ManyToManyField('Subject', related_name='subject_list', 
                  blank=True)


views.py
       

class Program_structure(generic.View):

    def get(self, *args, **kwargs):
        profile = get_object_or_404(Student, user=self.request.user)
        program_structure = Course.objects.filter(student=profile)
         # program_structure = 
        Course.objects.filter(student__user=self.request.user)


        credit = Course.objects.filter(student__user=self.request.user).
           annotate(total_no=Sum('subject__credit'))

        total_credit = self.request.user.course_set.aggregate(
             total_credit=Sum('subject__credit')
           )['total_credit'] or 0

     context = {
        'test':program_structure,
        'credit':credit,
        'profile':profile,
        'total_credit' : total_credit
    }
    return render(self.request, 'program_structure.html', context)

【问题讨论】:

  • 请出示您的Course模特
  • 我已经添加了你可以检查一下

标签: python django django-models django-views django-templates


【解决方案1】:

Courseuser 字段指的是Student 对象,而不是User 对象,因此您不能为此使用request.user

但是,您可以通过以下方式查询Course,其中userStudent,其中userrequest.user

class Program_structure(generic.View):

    def get(self, *args, **kwargs):
        profile = Student.objects.all()
        program_structure = Course.objects.filter(user__user=self.request.user)
        context = {
           'test':program_structure,
           'profile':profile,
        }
        return render(self.request, 'program_structure.html', context)

您可能还想将profile 设置为用户的Student 对象。在这种情况下,您可以在过滤 Courses 时重用 profile

from django.shortcuts import get_object_or_404

class Program_structure(generic.View):

    def get(self, *args, **kwargs):
        profile = get_object_or_404(Student, user=request.user)
        program_structure = Course.objects.filter(user=profile)
        context = {
           'test':program_structure,
            'profile':profile,
        }
        return render(self.request, 'program_structure.html', context)

最好将user 字段重命名为student

class Course(models.Model):
    student = models.ForeignKey(
        Student,
        on_delete=models.SET_NULL,
        null=True
    )
    # …

因为这表明这是Student,而不是User。在这种情况下,您可以使用以下内容进行过滤:

from django.shortcuts import get_object_or_404

class Program_structure(generic.View):

    def get(self, *args, **kwargs):
        profile = get_object_or_404(Student, user=request.user)
        program_structure = Course.objects.filter(student=profile)
        context = {
           'test':program_structure,
            'profile':profile,
        }
        return render(self.request, 'program_structure.html', context)

【讨论】:

  • AttributeError at /student/program_structure/ 'CustomUser' 对象没有属性 'course_set' 先生,我现在遇到了这个错误,你记得,你确实解决了 :) 你能检查我有编辑 views.py我该如何解决?
  • @Rafikhan: 就是下面的课程检索,你用total_credit = self.request.user.course_set.aggregate(...)代替total_credit = program_structure.aggregate(...)
  • 这太棒了,您可以出版一本书,我们可以向您学习,先生。传统书籍教程真的不讲这些问题,非常感谢。寻求您的建议如何在 django、python 中变得更好
  • 先生,我有一个问题,请您看看stackoverflow.com/questions/64476658/updateview-in-django
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 2021-04-08
  • 2023-03-27
  • 2020-04-04
  • 2021-10-12
  • 2021-02-15
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多