我正在寻找一种基于模型 ForeignKey 字段将一种类型的 QuerySet 转换为另一种类型的 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))
这从 Parent 的查询集中的记录中获取所有 child_id
FK,并直接重新查询 Child。当我检查 SQL 时,它会执行一个子查询,但我不确定这是否是最佳的或有一些奇怪的副作用。看起来原始父查询中的排序确实消失了,重复项也消失了。
还有比这更好的吗?
注意:我知道我可以直接通过 Child 查询并使用反向查找过滤 Parent 的字段,但这并不支持您在主模型上可以执行的所有操作。
最佳答案
试试这个,它会返回子类的query_set
parent_primary_keys = Parent.objects.filter(...).values_list('pk',flat=True)
children_qs = Child.objects.filter(id__in=parent_primary_keys)
关于python - 返回 ForeignKey 字段模型的 QuerySet 的 Django .values_list() 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019099/