我正在尋找一種乾淨的方式來基於模型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進行查詢,並使用反向查找篩選父項的字段,但不支持您在主模型上可以執行的所有操作。