0

親子(1-n)のモデル関係を取得しました:

class Parent(models.Model):
    some_fields = models.IntegerField()

class Child(models.Model):
    parent = models.ForeignKey(Parent, relatend_name='children')
    first = models.BooleanField()
    second = models.BooleanField()

次に、子フィールドに基づいて親をフィルタリングします。

Parent.objects.filter(children__first=True)

これにより、次の SQL が生成されます。

SELECT app_parent.*
FROM app_parent
INNER JOIN app_child ON app_parent.id = app_child.parent_id 
WHERE app_child.first = TRUE

その後、すべての親フィールド取得しましたが、関連する子フィールドもそのようなSQLを取得する必要があります:

SELECT app_parent.*, app_child.*
FROM app_parent
INNER JOIN app_child ON app_parent.id = app_child.parent_id 
WHERE app_child.first = TRUE

Django ORM 経由で取得します。何か案は?

アップデート

私は良い回避策があると思います

parents = Parent.objects.filter(children__first=True).prefetch_related('children') \
.extra(select={'child_id': '"app_child"."id"'})
for parent in parents:
    parent.child = [child for child in parent.children.all() if child == parent.child_id][0]
4

2 に答える 2

0

そのためにはfetch_relatedメソッドを使用する必要があり、残念ながら逆にルックアップを行う必要があります。

この場合、次のようになります。

first_children = Child.objects.filter(first=True).select_related('parent')
parents = [c.parent for c in first_children]
于 2013-05-14T13:23:28.453 に答える