我有两个型号
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稳定性的情况下按雇主列表分组?
答案 0 :(得分:8)
您可以在Employer
班级上放置其最新的JobTitle
激活日期,然后按此字段排序,而不使用关系。[1]这里的权衡是一些数据重复,并且必须在相应的JobTitle
实例更改时手动更新雇主的最新职位激活日期。
另外,请检查this post以查找使用annotate()
的其他解决方案。
相关问题: