gpt4 book ai didi

python - 返回 ForeignKey 字段模型的 QuerySet 的 Django .values_list() 替代方案?

转载 作者:太空狗 更新时间:2023-10-30 00:09:35 27 4
gpt4 key购买 nike

我正在寻找一种基于模型 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com