Python 从queryset获取相关对象,保留顺序

Python 从queryset获取相关对象,保留顺序,python,django,django-models,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(m

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

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)
当我选择一些点时,我希望它们按代理名称排序,如下所示:

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
queryset中获取queryset或唯一代理对象列表,从而保持顺序

最好不要再使用任何
order\u by()
语句,因为视图可能知道也可能不知道排序类型


类似于
设置(points.values\u list('agent',flat=True))
,但使用对象而不是pk-s?

使用代理对象管理器,并获取唯一的代理:

Agent.objects.filter(point__condition=...).distinct().order_by('-pk')

注意:
condition=…
应调整为
point\uu condition=…
您可以使用自己的想法,像这样嵌套它(其中
points
point
的任何
查询集
):

Django ORM将此转换为单个db查询。这应该有
代理的默认顺序。为了保留点中的代理顺序,可以执行以下操作:

[p.agent for p in points.distinct('agent')]
显然,这种解决方法不是queryset,只有Postgres才支持带有字段参数的
独特的

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')

你能解释一下“条件”代表什么吗?@MikeDoudkin,视情况而定。例如,问题中的
…smth…
last\u name='John'
,它需要转换为
point\u last\u name='John'
,就像@Parag的答案一样,我的帖子似乎有点误导性——它让你认为我希望代理一直是反向排序的,但事实是排序是任意的。我已经编辑了我的帖子,我已经试过了,你猜怎么着?似乎
值\u列表
不保留顺序!另外,
中的
id\uu对生成的查询集应用默认顺序。因此,我尝试保留
点的代理顺序,从而覆盖
代理的默认顺序。我知道,如果您不需要查询集:
[p.agent for p in points.distinct('agent')]
应该保留点顺序,但是是否有额外的循环,另外,
distinct(*fields)
仅由Postgrest支持这似乎是一个可行的解决方案。。。对于那些使用Postgres的人(你能把你的建议作为一个答案发布吗,所以我把它标记为正确的?我的帖子有点误导性——它让你认为我希望代理一直被反向排序,但事实是排序是任意的。我用@schwobasegl的答案编辑了我的帖子,这会起作用,但只对Postgres有效(我使用MySQL)