基本的に、私は以下を行うための優雅な方法が必要です:-
obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2_qs = QuerySet(model=Model2, qs_items=[obj1.model2,obj2.model2])
私は正しく考えていないかもしれませんが、次のようなことをするのは私にとって無限に愚かです:-
obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
model2_qs = Model2.objects.filter(pk=obj1.model2.pk)
はい、Model2のQuerySetを後で使用するために終了する必要があります(特にDjangoフォームに渡すため)。
上記の最初のコードブロックでは、filter
ではなくget
を使用しても、Model1のQuerySetがあることは明らかです。私の場合、逆ルックアップが常に可能であるとは限りません。
SQLで表現できない複雑なプロセスを通じて選択するアイテムのクエリセットを作成するだけの場合は、常に__in
演算子を使用できます。
wanted_items = set()
for item in model1.objects.all():
if check_want_item(item):
wanted_items.add(item.pk)
return model1.objects.filter(pk__in = wanted_items)
あなたは明らかにこれをあなたの状況に適応させる必要がありますが、それは少なくともあなたに出発点を与えるはずです。
QuerySetにオブジェクトを手動で追加するには、_result_cache
を試してください:
objs = ObjModel.objects.filter(...)
len(objs) #or anything that will evaluate and hit the db
objs._result_cache.append(yourObj)
PS:私はchefsmartの質問を理解しませんでした(または試みました)が、これはタイトルの質問に対する答えだと思います。
QuerySetに手動でオブジェクトを追加することはできません。しかし、なぜあなたはそれらをリストに入れませんか?
obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2 = list(obj1, obj2)