【问题标题】:Django .values_list() alternative that returns a QuerySet for a ForeignKey field's model?为外键字段模型返回查询集的 Django .values_list() 替代方法?
【发布时间】: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


    【解决方案1】:

    试试这个,它会返回子类的query_set

    parent_primary_keys = Parent.objects.filter(...).values_list('pk',flat=True)
    
     children_qs = Child.objects.filter(id__in=parent_primary_keys)
    

    【讨论】:

      【解决方案2】:

      听起来你可以利用 Django 的函数prefetch_relatedCheck out this answerdjango's documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多