2016-12-07 235 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) 
相關問題