web-dev-qa-db-ja.com

Django QuerySetを手動で作成するか、QuerySetにオブジェクトを手動で追加する

基本的に、私は以下を行うための優雅な方法が必要です:-

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があることは明らかです。私の場合、逆ルックアップが常に可能であるとは限りません。

27
chefsmart

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)

あなたは明らかにこれをあなたの状況に適応させる必要がありますが、それは少なくともあなたに出発点を与えるはずです。

36
JudoWill

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の質問を理解しませんでした(または試みました)が、これはタイトルの質問に対する答えだと思います。

16
Arthur

QuerySetに手動でオブジェクトを追加することはできません。しかし、なぜあなたはそれらをリストに入れませんか?

obj1 = Model1.objects.select_related('model2').get(attribute1=value1)
obj2 = Model1.objects.select_related('model2').get(attribute2=value2)
model2 = list(obj1, obj2)
4
Nicu Surdu