Django查询中的distinct和order_by

16

我有两个模型

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个回答

8
你可以在Employer类上放置其最新的JobTitle激活日期,然后按照此字段排序而不使用关系[1]。这里的权衡是一些数据重复,并且需要在相应的JobTitle实例更改时手动更新雇主的最新工作标题激活日期。
另外,请查看这篇文章,了解另一种使用annotate()的解决方案。
相关问题:
[1]Queryset API distinct() does not work?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接