我的学生模特:
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
我想基于'name','father,'mother'字段获取重复的对象。我发现了具有values_list('name','mother','father')的重复对象,但我无法找到ID通过这种方式处理对象。如果我将id字段添加到values_list方法中,则找不到重复的对象。
Student.objects.values('name', 'father', 'mother').annotate(Count('name')).order_by().filter(name__count__gt=1)
此查询后,我需要学生对象的ID。
答案 0 :(得分:1)
您尝试执行的操作没有任何意义。
您正在汇总许多记录,然后仅查找那些汇总对象之一的PK。
考虑在8条记录中存在名称“ Bill”的情况。您希望返回哪个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
答案 1 :(得分:0)
一旦调用values_list()
或values()
,您将无法找回原始对象。 values()
返回dictionaries, not model instances。但是,如果您需要主键,则只需将pk
添加到值列表中即可:
Student.objects.values('pk', 'name', 'father', 'mother')\
.annotate(Count('name'))\
.order_by()\
.filter(name__count__gt=1)