2016-12-07 45 views
3

我正在寻找一种干净的方式来基于模型ForeignKey字段将一种类型的QuerySet转换为另一种类型,所以基本上类似于.values_list('my_fk', flat=True),但返回适当的QuerySet而不是values_list()变体。Django .values_list()是否为外键字段的模型返回一个QuerySet?

例如:

class Parent(models.Model): 
    child = models.ForeignKey(Child) 
    ... 

children_qs = Parent.objects.filter(...).theMagicMethod('child') 

这里children_qs现在应该是在前面的查询中使用的所有子实例一个查询集,而不是一个QuerySet返回父实例。

您可以排序的做到这一点与自定义查询集和__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进行查询,并使用反向查找筛​​选父项的字段,但不支持您在主模型上可以执行的所有操作。

回答

2

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

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

children_qs = Child.objects.filter(id__in=parent_primary_keys) 
相关问题