Django 在一对一字段模型中查询复杂查询



>我有两种学生和家长模型

学生 models.py:

class StudentInfo(models.Model):
admissionNumber = models.BigIntegerField(primary_key=True,default=0)
firstName = models.CharField(max_length=20)
lastName = models.CharField(max_length=20)
fullName = models.CharField(max_length=50)
gender = models.CharField(max_length=20)
dob = models.DateField(null=True)
classSection = models.CharField(max_length=20)

父 models.py

class ParentInfo(models.Model):
student = models.OneToOneField(StudentInfo,primary_key=True, on_delete=models.CASCADE)
fatherName = models.CharField(max_length=20)
motherName = models.CharField(max_length=20)

我有一个表格,可以通过他们的父亲姓名搜索学生。

所以,我想要的是过滤那些父亲的名字包含"某个名字"的学生。

我试过这个,但它导致父信息的查询集:

parentInfo = ParentInfo.objects.all()
studentsInfo = parentInfo.filter(parent__fName = fName).select_related('student')

你应该以相反的方式过滤,比如:

StudentInfo.objects.filter(parentinfo__fatherName='name of father')

因此,您在此处获得StudentInfos 的QuerySet,其中包含零个、一个或多个StudentInfo,其中有一个相关的ParentInfo对象,其中fatherName字段位于,在本例中为'Name of father'

注意:最好以相反的顺序实现ForeignKey,以便多个学生可以引用同一个ParentInfo对象。现在,ParentInfo对象可以只引用一个StudentInfo。如果有父母(兄弟姐妹(相同的学生,则在数据库中引入数据重复。

# You can use contains attribute on the field of model and your query can be like this
student = models.ParentInfo.objects.values('student__firstName', 'student__lastName').filter(fatherName__contains='your value')

print(student[0]['student__firstName'])
print(student[0]['student__lastName'])