1

そのため、次の状況で苦労しています。

次のモデルを検討してください。

class A(models.Model):
    foo = models.IntegerField(default=0)

class B(models.Model):
    a_models = models.ForeignKey('A', related_name='b_models')
    bar = models.IntegerField(default=0)

class bChild(B):
    bla = models.IntegerField(default=0)

A のインスタンス a_instance があり、それと関係があるクラス B のすべてのインスタンスを取得したい場合は、次を使用できます。

all_b_models = a_instance.b_models.all()

私の質問は、bChilds を持つものだけを取得したい場合:

all_bChild_models = a_instance.b_models.filter(???)

「???」には何を入れればいいですか?

これに関するドキュメントは見つかりません。私がうまくいくと思うことの1つは、次を使用することです:

??? = pk__in=bChild.objects.all().values_list('pk')

ただし、django は複数テーブルの継承に対して暗黙的な後方関係を作成するため、より簡単なクエリがあるかどうか疑問に思っていました。

ありがとう、ホルヘ

4

2 に答える 2

2

さて、私はそれを自分で理解しました。

どうやら、モデルに子がない場合、djangoはpkがnullであると見なします。

したがって、次を使用できます。

all_bChild_models = a_instance.b_models.filter(bchild__pk__isnull=False)

これにより、bChildモデルが指しているすべてのbモデルが返されます。

于 2012-12-06T08:30:01.987 に答える
1

単純にこれを行うことができるのに、Aインスタンスを介してのみbChildオブジェクトをフェッチしたい理由はありますか:

result = bChild.objects.filter(a_models = a)

あなたのアプローチは機能しません.pkでフィルタリングするためのフラットリストが必要です:

all_bChild_models = a_instance.b_models.filter(pk__in = bChild.objects.values_list('pk', flat=True))
于 2012-12-05T16:45:43.940 に答える