django在values_list之后获取原始对象

时间:2018-08-08 19:26:09

标签: django

我的学生模特:

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。

2 个答案:

答案 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)