web-dev-qa-db-ja.com

Djangoフィールドルックアップを使用せずにクエリセットから特定のインスタンスを除外する

一部のインスタンスがクエリセットから除外されていることを確認する必要がある場合があります。
これは私が通常行う方法です。

unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
uninteresting_stuff_happens()
my_results = MyModel.objects.exclude(id=unwanted_instance.id)

または、私がそれらをもっと持っている場合:

my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])

これは少し不格好な感じなので、試してみました。

my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)

うまくいきません。しかし、私は ここではSO を読みました。サブクエリを除外のパラメータとして使用できることを示しています。
私は運が悪いのですか?一部の機能が不足していますか(ドキュメントを確認しましたが、有用なポインタが見つかりませんでした)。

36
Agos

あなたがすでにやっている方法が最善の方法です。

それがあなたが探しているこれを行うモデルにとらわれない方法であるなら、あなたがquery.exclude(pk=instance.pk)を行うことができることを忘れないでください。

余談ですが、if DjangoのORMにはIDマッパー(現在はありません)があり、MyModel.objects.filter(<query>).all().remove(<instance>)のようなことができますが、その点で運が悪い。あなたがそれをしている方法(または上記のもの)はあなたが持っている最高のものです。

ああ、また、リスト内包表記を使用すると、inクエリよりもはるかに優れた処理を実行できます。query.exclude(id__in=[o.id for o in <unwanted objects>])

73
obeattie

与えられた答えは完璧です、これを試してください私にとってはうまくいきます

ステップ1)

 from Django.db.models import Q

ステップ2)

 MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>]))
6
kartheek

不要なアイテムをリストに入れ、リストにあるものを除くすべてのアイテムを次のように取得できます。

MyModel.objects.exclude(id__in=[id1,id2,id3 ])
1
Seyyid Said