django ValueError无法查询“ abcd@gmail.com”:必须是“对象”实例

时间:2020-10-19 16:13:27

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

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

/ student / program_structure /中的ValueError 无法查询“ abcd@gmail.com”:必须是“ Student”实例。

非常感谢您:)

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)

1 个答案:

答案 0 :(得分:1)

user的{​​{1}}字段引用Course对象,而不是Student对象,因此您不能为此使用User。 / p>

不过,您可以使用以下方法查询request.user,其中Courseuser,其中Studentuser

request.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重用 profile

Course

最好将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