外部キーを使用して関連する記事とブログの2つのモデルがあります。記事を抽出しながらブログ名のみを選択したい。
articles = Articles.objects.all().select_related('blog__name')
生成されたクエリは、ブログモデルからすべてのフィールドを選択したことを示しています。 select_relatedでonly()とdefer()を使用してみましたが、どちらもうまくいきませんでした。
articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time')
上記のクエリでエラーが発生しました:select_relatedで指定されたフィールド名が無効です:選択肢は次のとおりです:ブログ
記事フィールドとブログ名のみが選択されるようにクエリを生成するにはどうすればよいですか?
これには annotate() を使用できます。
>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first()
>>> a.title
>>> a.blog_name
select_related
はモデル全体で使用する必要があります。そうすれば、さらにフィルタリングできます。これは動作します:
Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time')