【发布时间】:2017-04-22 11:50:13
【问题描述】:
我正在寻找一种基于模型 ForeignKey 字段将一种类型的 QuerySet 转换为另一种类型的干净方法,因此基本上类似于 .values_list('my_fk', flat=True) 但返回正确的 QuerySet 而不是 values_list() 变体。
例如:
class Parent(models.Model):
child = models.ForeignKey(Child)
...
children_qs = Parent.objects.filter(...).theMagicMethod('child')
这里的children_qs 现在应该是前面查询中使用的所有子实例的查询集,而不是返回父实例的查询集。
您可以使用自定义查询集和__in 查找来做到这一点,但感觉有点臭:
class ParentQuerySet(models.QuerySet):
...
def children(self):
return Child.objects.filter(id__in=self.values_list('child_id', flat=True))
这会从父查询集中的记录中获取所有child_id FK,然后直接重新查询子查询。当我检查 SQL 时,它会执行一个子查询,我不确定这是否是最佳的或有一些奇怪的副作用。看起来来自原始父查询的排序已经消失,重复项也是如此。
还有比这更好的吗?
注意:我知道我可以通过 Child 直接查询并使用反向查找过滤 Parent 的字段,但这并不支持您可以在主模型上执行的所有操作。
【问题讨论】:
标签: python django django-queryset