web-dev-qa-db-ja.com

djangoで空のクエリセットを作成し、オブジェクトを手動で追加する方法

クエリセットを作成し、テーブルに表示するために異なるクエリ結果から取得したオブジェクトを手動で追加する必要があります。私はxx = set()を使用しますが、それは仕事をしません。

22
user2137817

次のいずれかの方法で実行できます。

from itertools import chain
#compute the list dynamically here:
my_obj_list = list(obj1, obj2, ...)
#and then 
none_qs = MyModel.objects.none()
qs = list(chain(none_qs, my_obj_list))

次のこともできます。

none_qs = MyModel.objects.none()
qs = none_qs | sub_qs_1 | sub_qs_2

ただし、これはnotスライスされたクエリセットで機能します

24
karthikr

それはできません。クエリセットは、データベースクエリの表現です。手動でアイテムを追加することはできません。

ただし、モデルインスタンスの任意の順序付きコレクションが必要な場合は、リストを使用してください。

11
Daniel Roseman

私はこれに本当に遅れていますが、将来の参照のために、特定のプロパティを持つオブジェクトをすべてフィルタリングしてクエリセットを作成できます。

フィールドオブジェクトプロパティのフィルタリング

Model.objects.filter(foo='bar')
Model.objects.exclude(foo='bar')

非フィールドオブジェクトプロパティのフィルタリング

def return_queryset_with_desired_objects(self):
    qs = SomeModel.objects.all()
    wanted_ids = [obj.id for obj in qs if obj.foo]
    return self.filter(id__in=wanted_ids]

def return_queryset_without_undesired_objects(self):
    qs = SomeModel.objects.all()
    unwanted_ids = [obj.id for obj in qs if not obj.foo]
    return self.exclude(id__in=unwanted_ids]
9
lukeaus