我有一个模型,看起来像这样:
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?
答案 0 :(得分:1)
您可以使用自己的想法并将其嵌套(points
为QuerySet
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')