从查询集中获取相关对象,保留顺序

时间:2016-03-17 09:30:35

标签: python django django-models

我有一个模型,看起来像这样:

class Agent(models.Model):
    class Meta:
        ordering = ['first_name', 'last_name', ]
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    ... some other fields ...

class Point(models.Model):
    agent = models.ForeignKey(Agent)
    ... some other fields ...

当我选择一些点时,我希望它们按代理名称排序,如下所示:

points = Point.objects.filter(...smth...).order_by(-agent)

因此,生成的查询集按代理名称排序,从Z到A

points = Point.objects.filter(...smth...).order_by(agent)

甚至没有订购

问题是: 如何从points queryset获取查询集或唯一代理对象列表,保留排序?

首选,没有任何order_by()语句,因为视图可能会或可能不会明确地知道排序类型

类似于set(points.values_list('agent', flat=True)),但有对象而不是pk-s?

3 个答案:

答案 0 :(得分:1)

您可以使用自己的想法并将其嵌套(pointsQuerySet Point的任何Agent.objects.filter(id__in=points.values_list('agent', flat=True)) ):

Agent

Django ORM会将其转换为单个数据库查询。这应该有[p.agent for p in points.distinct('agent')] 的默认顺序。要以点数保留代理订单,您可以执行以下操作:

distinct

显然,这种解决方法不是查询集,只有Postgres支持带有字段参数的iuwehrc3948hg3w09x4h

答案 1 :(得分:0)

使用代理对象管理器和QuerySet.distinct获取唯一代理:

ImageSource

注意:Agent.objects.filter(point__condition=...).distinct().order_by('-pk') 应调整为condition=...

答案 2 :(得分:0)

这应该有用。

Agent.objects.filter(id__in=Point.objects.values_list('agent_id', flat=True)).order_by('-first_name')

<强>更新

Point.objects.filter(agent_id__in=Agent.objects.values_list('id', flat=True)).distinct('agent').order_by('-agent__first_name')