【发布时间】:2016-05-15 01:32:23
【问题描述】:
在 Django 中,在给定模型上,RelatedManager 看起来只能静态设置 (see: docs),但有没有办法在给定查询集的相关管理器上设置 order_by?我尝试使用prefetch_related 和Prefetch,但这似乎不起作用:
qs = qs.prefetch_related(
Prefetch('item_set', queryset=Item.objects.order_by('capture_dt').all()))
res = qs.first().item_set.all().ordered
在这种情况下,res 是 False。
当我尝试访问相关管理器时出现问题:访问 w/o order_by 不会调用另一个 SQL 查询,而如果我然后尝试 order_by,则会执行另一个查询,这会导致 N + 1 SQL要执行的查询。
这两行返回相同的结果,但第一行生成的 SQL 查询要少得多:
r0 = [x.pk for x in sorted(self.parent.item_set.all(), key=lambda s: s.capture_dt)].index(self.pk)
r1 = list(x.pk for x in self.parent.item_set.order_by('capture_dt').all()).index(self.pk)
【问题讨论】:
-
没有模型很难说,你在找
.order_by('fkmodel__field')?.. -
我不想订购顶级查询集(上面是
qs)。我只想为qs中的每个条目订购item_set中的项目。
标签: django django-queryset django-orm django-select-related