0

2つのキーで2つのQuerySetをマージしたいと思います。

class ModelA(models.Model)
  text = models.CharField(max_length=10)

class ModelB(models.Model)
  value = models.CharField(max_length=10)
  model_a = models.ForeignKey(ModelA)
  additionalkey =  models.CharField(max_length=10)  

すべてのModelAオブジェクトにクエリセットがすでにあり、追加のキーに応じて、ForeignKey-RelationShipからModelAへの2番目のモデル(ModelB)からの対応するエントリが必要であるとします。これを達成するための最速かつ最も効率的な方法は何でしょうか?

すべてのエントリをループしてこれを行うと、ModelA-QuerySetのすべてのエントリのデータベースがヒットします。

私の考えは、すべてのModelBオブジェクトを一度に取得し、ForeignKeyとadditionalkeyが適合する完全なModelAセットと結合/マージすることです。

誰かにアイデアやヒントはありますか?

編集:

わかりました、正確には。私はすでにModelAのクエリセットを持っています。結局のところ、1つのクエリセット(またはテンプレートで反復できる他の何か)に両方のテーブルからの情報を含むクエリセットが必要です。

4

3 に答える 3

0
modela = ModelA.objects.filter()
modelb = ModelB.objects.filter()

......................    

{% for a in modela %}
    {{....}}

    {% for b in a.modelb %}
        {{....}}
    {% endfor %}
{% endfor %}
于 2013-02-14T13:06:31.143 に答える
0

質問を理解しているかどうかはわかりませんが、おそらく:

ModelA.objects.all().filter(modelb__additionalkey='foo')

于 2013-02-14T12:24:04.613 に答える
0

modelA クエリセットの pk のリストを使用して、modelB をフィルタリングできます。

pk_list = model_a_queryset.values_list('pk', flat=True)
ModelB.objects.filter(model_a__pk__in=pk_list)

または、ModelB を何らかの値でフィルタリングして、最初のクエリセットを取得することもできます。

ModelB.objects.filter(model_a__title="foo")
于 2013-02-14T12:26:44.627 に答える