web-dev-qa-db-fra.com

Sélection de champs spécifiques à l'aide de select_related dans Django

J'ai deux modèles d'article et de blog liés à l'aide d'une clé étrangère. Je souhaite sélectionner uniquement le nom du blog lors de l'extraction de l'article.

articles = Articles.objects.all().select_related('blog__name')

La requête générée montre qu'elle a sélectionné tous les champs du modèle Blog. J'ai essayé d'utiliser seulement () et defer () avec select_related mais les deux n'ont pas fonctionné.

articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time')

La requête ci-dessus a généré une erreur: nom (s) de champ non valide (s) donné (s) dans select_related: les choix sont: blog

Comment générer une requête pour que seuls les champs d'article et le nom du blog soient sélectionnés?

25
RA123

Vous pouvez utiliser annotate () pour cela.

>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first()
>>> a.title
>>> a.blog_name
22
brki

select_related doit être utilisé sur l'ensemble du modèle, puis vous pouvez le filtrer davantage. Cela fonctionnera:

Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time')
23
T. Opletal