在查询中使用查询的 Django 不起作用
Django using a Query in a Query does not work
所以我有这个模型:
class Student(models.Model):
id = models.AutoField(primary_key=True)
first_name=models.CharField(max_length=50)
last_name=models.CharField(max_length=50)
title=models.CharField(max_length=30,default="",blank=True)
tel=models.CharField(max_length=50,default="",blank=True)
e_mail=models.CharField(max_length=50,default="",blank=True)
social_media=models.CharField(max_length=50,default="",blank=True)
social_media2=models.CharField(max_length=50,default="",blank=True)
social_media3=models.CharField(max_length=50,default="",blank=True)
street=models.CharField(max_length=50)
postal=models.CharField(max_length=50)
city=models.CharField(max_length=50)
country=models.CharField(max_length=50)
graduation_uni=models.DateField(null=True,default=None,blank=True)
graduation_ikomt=models.DateField(null=True,default=None,blank=True)
certificate_no=models.CharField(max_length=50,default="",blank=True)
def __str__(self):
return str(self.id) + " - " +self.first_name + " " + self.last_name
class Course(models.Model):
id = models.AutoField(primary_key=True)
course=models.CharField(max_length=50)
description=models.CharField(max_length=50,null=True,default=None,blank=True)
start_date=models.DateField(null=True,default=None,blank=True)
end_date=models.DateField(null=True,default=None,blank=True)
def __str__(self):
return str(self.id) + " - " +self.course + " | " + self.start_date.strftime("%d.%m.%y") + " - " + self.end_date.strftime("%d.%m.%y")
class StudentInCourse(models.Model):
StudentId = models.ForeignKey(Student, on_delete=models.CASCADE)
CourseId = models.ForeignKey(Course, on_delete=models.CASCADE)
def __str__(self):
return str(Student.objects.get(id=self.StudentId.id)) + " in " + str(Course.objects.get(id=self.CourseId.id))
而且我想使用这样的查询(在我的 views.py 中)仅显示特定课程中的学生:
students_in_course=StudentInCourse.objects.filter(CourseId=id)
latest_student_list = Student.objects.filter(id__in=students_in_course)
遗憾的是,我只得到一个空结果。任何想法我做错了什么?我认为 Primary/Foreign 关键关系过滤器应该以这种方式工作?
如有任何建议,我们将不胜感激。
问候
您尝试以这样的方式进行过滤,即检索 Student
个“发生”的主键与 [=11] 的主键相同=]对象,这个意义不大。
您可以过滤:
latest_student_list = Student.objects.filter(<strong>studentincourse__CourseId=id</strong>)
或者如果你想使用两个 QuerySet
s(看起来不太优雅),你可以使用:
students_in_course=StudentInCourse.objects.filter(CourseId=id)<strong>.values('StudentId')</strong>
latest_student_list = Student.objects.filter(id__in=students_in_course)
Note: Normally one does not add a suffix Id
to a ForeignKey
field, since Django
will automatically add a "twin" field with an _id
suffix. Therefore it should
be course
, instead of CourseId
.
所以我有这个模型:
class Student(models.Model):
id = models.AutoField(primary_key=True)
first_name=models.CharField(max_length=50)
last_name=models.CharField(max_length=50)
title=models.CharField(max_length=30,default="",blank=True)
tel=models.CharField(max_length=50,default="",blank=True)
e_mail=models.CharField(max_length=50,default="",blank=True)
social_media=models.CharField(max_length=50,default="",blank=True)
social_media2=models.CharField(max_length=50,default="",blank=True)
social_media3=models.CharField(max_length=50,default="",blank=True)
street=models.CharField(max_length=50)
postal=models.CharField(max_length=50)
city=models.CharField(max_length=50)
country=models.CharField(max_length=50)
graduation_uni=models.DateField(null=True,default=None,blank=True)
graduation_ikomt=models.DateField(null=True,default=None,blank=True)
certificate_no=models.CharField(max_length=50,default="",blank=True)
def __str__(self):
return str(self.id) + " - " +self.first_name + " " + self.last_name
class Course(models.Model):
id = models.AutoField(primary_key=True)
course=models.CharField(max_length=50)
description=models.CharField(max_length=50,null=True,default=None,blank=True)
start_date=models.DateField(null=True,default=None,blank=True)
end_date=models.DateField(null=True,default=None,blank=True)
def __str__(self):
return str(self.id) + " - " +self.course + " | " + self.start_date.strftime("%d.%m.%y") + " - " + self.end_date.strftime("%d.%m.%y")
class StudentInCourse(models.Model):
StudentId = models.ForeignKey(Student, on_delete=models.CASCADE)
CourseId = models.ForeignKey(Course, on_delete=models.CASCADE)
def __str__(self):
return str(Student.objects.get(id=self.StudentId.id)) + " in " + str(Course.objects.get(id=self.CourseId.id))
而且我想使用这样的查询(在我的 views.py 中)仅显示特定课程中的学生:
students_in_course=StudentInCourse.objects.filter(CourseId=id)
latest_student_list = Student.objects.filter(id__in=students_in_course)
遗憾的是,我只得到一个空结果。任何想法我做错了什么?我认为 Primary/Foreign 关键关系过滤器应该以这种方式工作?
如有任何建议,我们将不胜感激。
问候
您尝试以这样的方式进行过滤,即检索 Student
个“发生”的主键与 [=11] 的主键相同=]对象,这个意义不大。
您可以过滤:
latest_student_list = Student.objects.filter(<strong>studentincourse__CourseId=id</strong>)
或者如果你想使用两个 QuerySet
s(看起来不太优雅),你可以使用:
students_in_course=StudentInCourse.objects.filter(CourseId=id)<strong>.values('StudentId')</strong>
latest_student_list = Student.objects.filter(id__in=students_in_course)
Note: Normally one does not add a suffix
Id
to aForeignKey
field, since Django will automatically add a "twin" field with an_id
suffix. Therefore it should becourse
, instead of.CourseId