Django关联模型排序返回重复元素解决方法

在Django ORM中,使用order_by()方法对包含关联关系的模型进行排序时,返回结果中可能会出现重复元素。

假设有下面的两个模型Client和Interaction,Client为顾客,Interaction为交互。

Client类中包含顾客的姓名和联系方式,Interaction类中包含标题、时间、待办事项、截止日期。

class Client(models.Model):
    name = models.CharField(max_length=255, unique=True)
    contact = models.CharField(max_length=255, null=True, blank=True)

class Interaction(models.Model):
    client = models.ForeignKey(Client)
    title = models.TextField()
    when = models.DateTimeField()
    todo = models.TextField(null=True, blank=True)
    deadline = models.DateTimeField(null=True, blank=True)

现在想要查询按照交互的截止日期倒序排列的客户列表。

'clients' : Client.objects.all().order_by('-interaction__deadline'),

返回结果中包含重复元素。由于Client和Interaction为一对多的关系,因此对于每一个Interaction都返回了一个Client元素,而非仅仅是对结果进行排序。大家提到需要使用distinct(),但是distinct()对于这个特例并不适用,因为考虑到它们彼此之间存在的关联关系,结果返回值已经唯一的了。

通过Google,我发现了解决方法!相关博文链接:http://archlinux.me/dusty/2010/12/07/django-dont-use-distinct-and-order_by-across-relations/

解决方法就是添加annotate()!

'clients' : Client.objects.all().annotate().order_by('-interaction__deadline'),

这样就解决了问题,非常简洁!

原文链接:Django – Duplicates in related model using order_by 

本文链接:http://bookshadow.com/weblog/2015/04/21/django-duplicates-in-related-model-using-order-by/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码