web-dev-qa-db-fra.com

Django objects.filter () values_list () vs python compréhension de la liste pour la requête __in)

J'ai une bizarrerie (?) Avec Django filtrage par ensemble de requêtes:

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

ou

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

et

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

alors, comment utiliser values_list ()? (produire):

[1]

ou python la compréhension de la liste est-elle la "voie à suivre"?

28
Daryl

Essayez l_magazines.values_list('id', flat=True). Cela renvoie une liste d'ID au lieu d'une liste de tuples d'ID unique.

58
Cloud Artisans

Une chose à noter est qu'il existe une différence dans le comportement de values ​​/ values_list par rapport à une compréhension de liste:

  • values ​​/ values_list donnera la valeur réelle stockée dans le champ, c'est-à-dire juste l'id (pas tout l'objet)
  • si la valeur est une clé étrangère et que les relations appropriées sont définies dans votre modèle, la compréhension de la liste vous donnera l'objet auquel la clé étrangère fait référence.

Choisir le mauvais se traduira soit par des hits de base de données inutiles, soit par des failles inutiles, selon ce que vous essayez de faire.

2
Marcin