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)