我的学生模型:
class Student(Person):
father = models.ForeignKey('Person', on_delete=models.SET_NULL, blank=True,
null=True,related_name='student_father',help_text=_('Father'))
mother = models.ForeignKey('Person', on_delete=models.SET_NULL, blank=True,
null=True,related_name=_('student_mother'),help_text=_('Mother'))
classroom = models.IntegerField(ClassRoom.choices(), null=True, blank=True,
help_text=_('Classroom'))
..and some other fields
我想根据"名称","父亲","母亲"字段获取重复的对象。我发现了带有values_list("名称","母亲","父亲"(的重复对象,但是我无法通过这种方式访问对象的id。如果我将id字段添加到values_list方法找不到重复的对象。
Student.objects.values('name', 'father', 'mother').annotate(Count('name')).order_by().filter(name__count__gt=1)
在此查询之后,我需要学生对象的 id。
你尝试做的事情没有意义。
您正在聚合许多记录,然后仅查找其中一个聚合对象的 PK。
考虑名称"Bill"存在于 8 条记录中的场景。你希望返回哪个PK,哪个记录?
您需要执行第二个查询,以获取具有重复名称的对象的 PK:
names_list = Student.objects.values('name', 'father', 'mother').annotate(Count('name')).order_by().filter(name__count__gt=1)
for names in names_list:
duplicates = Student.objects.filter(name=names.name)
for dup in duplicates:
print dup.pk
一旦你调用values_list()
或values()
,你就无法取回原来的对象。values()
返回字典,而不是模型实例。但是,如果需要主键,只需将pk
添加到值列表中:
Student.objects.values('pk', 'name', 'father', 'mother')
.annotate(Count('name'))
.order_by()
.filter(name__count__gt=1)