Django查询与distinct和order_by

时间:2011-07-11 10:04:40

标签: django django-models group-by distinct

我有两个型号

class Employer(models.Model):
     name = models.CharField(max_length=300, blank=False)
     id = models.IntegerField()
     status = models.IntegerField()
     eminence = models.IntegerField(null=False,default=4)

class JobTitle(models.Model)
     name = models.CharField(max_length=300, blank=False)
     employer = models.ForeignKey(Employer,unique=False,null=True)
     activatedate = models.DateTimeField(default=datetime.datetime.now)

我需要所有雇主按其工作标题的顺序激活。

Employer.objects.filter(status=1).order_by('eminence','-jobtitle__activatedate')

这个查询给了我想要的东西,但如果雇主有多个职位,它会返回重复的雇主。

我会使用distinct()但是在Django文档中我发现了

* order_by()调用中使用的任何字段都包含在SQL SELECT列中。当与distinct()一起使用时,这有时会导致意外结果。如果您按相关模型中的字段进行排序,则这些字段将添加到选定的列中,否则可能会使重复的行显示为不同。由于额外的列不会出现在返回的结果中(它们仅用于支持排序),因此有时看起来会返回非独特的结果。*

虽然他们解释了我的问题但没有指定解决方案。

可以给我一个建议,如何在不破坏API稳定性的情况下按雇主列表分组?

1 个答案:

答案 0 :(得分:8)

您可以在Employer班级上放置其最新的JobTitle激活日期,然后按此字段排序,而不使用关系。[1]这里的权衡是一些数据重复,并且必须在相应的JobTitle实例更改时手动更新雇主的最新职位激活日期。

另外,请检查this post以查找使用annotate()的其他解决方案。

相关问题:

[1] Queryset API distinct() does not work?