首页 > 解决方案 > django ValueError 无法查询“abcd@gmail.com”:必须是“对象”实例

问题描述

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

/student/program_structure/ 处的 ValueError 无法查询“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)

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


user字段是CourseStudent对象,而不是User对象,因此您不能request.user为此用户。

但是,您可以查询 a Coursewhere the useris a Studentwhere the useris request.userwith:

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)

推荐阅读