web-dev-qa-db-ja.com

Django objects.filter()values_list()vs python __inクエリのリスト内包表記

Djangoクエリセットフィルタリング付きの癖(?)があります:

ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id'))
Out[0]: []

または

ipdb> MagazineIssue.objects.filter(id__in=[l_magazine.id for l_magazine in l_magazines])
Out[0]: [<MagazineIssue: Architecture Australia, Jan 1995 (#1)>]

そして

ipdb> l_magazines.values_list('id')
Out[0]: [(1,)]
ipdb> [l_magazine.id for l_magazine in l_magazines]
Out[0]: [1]

それでは、values_list()の使い方は? (生産する):

[1]

またはpythonリストの理解は「進むべき道」ですか?

28
Daryl

l_magazines.values_list('id', flat=True)を試してください。これは、単一のIDタプルのリストではなく、IDのリストを返します。

58
Cloud Artisans

注意すべきことの1つは、値/ values_listの動作がリスト内包表記と異なることです。

  • values/values_listは、フィールドに格納されている実際の値、つまり、IDのみ(オブジェクト全体ではなく)を生成します
  • 値が外部キーであり、モデルに適切なリレーションが設定されている場合、リスト内包は外部キーによって参照されるオブジェクトを提供します。

間違ったものを選択すると、実行しようとしていることに応じて、不必要なデータベースヒットが発生したり、不必要に不自然になったりします。

2
Marcin