为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2023-12-05 15:18:38
我正在尝试为学生制作一个应用程序,但我收到了此错误,正如您所看到的,为了方便起见,我想使用如下所示的应用程序,但它不起作用,我应该像以前一样继续使用吗?或者我可以这样使用?最好的办法是什么?/student/program_struct/ 处的 ValueError 无法查询“ abcd@gmail.com ”:必须是“学生”实例。太感谢了 :)models.pyclass 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 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

该user字段Course指的是Student对象,而不是User对象,因此您不能使用request.user它。


但是,您可以查询Coursewhere the useris a Studentwhere the useris 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用户的对象。在这种情况下,您可以在过滤s时重用:profileCourse


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

    )

    # …

因为这清楚地表明这是 a Student,而不是 a 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)


查看完整回答
反对 回复 2023-12-05
  • 1 回答
  • 0 关注
  • 47 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信