質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1166閲覧

djangoで違うモデルの情報を検索結果に出す方法

pappychamp

総合スコア3

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/23 09:45

前提・実現したいこと

djangoを勉強しているものです。
検索機能を作成中です。コードを見て頂いたらお分かりになると思いますが、PublishsとBookというmodelがあり
PublishsのidとBookのpublisher(外部キー)がforeignkeyで繋がっています。
Bookのフィールドを使った検索機能はfilterを使ってできました。
しかし、Publishsのフィールドを使った検索機能をfilterを使って実装した結果、思うようにいきません。

Publishsのフィールドを使って検索をかけて、結果にBookとPublishsのフィールドを用いて出力したいです。

どのような些細なことでも、よろしくお願いします。

発生している問題・エラーメッセージ

セレクトボックスで'出版社'を選択して検索ボタンを押したときのエラー文です。

Exception Type: FieldError
Exception Value:
Cannot resolve keyword 'publisher_name' into field. Choices are: author, id, price, publisher, publisher_id, title

このエラーメッセージでは author, id, price, publisher, publisher_id, titleしか検索にかけられないよ、ということを
言おうとしてる理解です。
その時に裏で動いているsql文が以下です。

SELECT "app_book"."id",
"app_book"."title",
"app_book"."publisher_id",
"app_book"."author",
"app_book"."price",
"app_publishs"."id",
"app_publishs"."name"
FROM "app_book"
INNER JOIN "app_publishs"
ON ("app_book"."publisher_id" = "app_publishs"."id")

該当のソースコード

django

1---model--- 2class Publishs(models.Model): 3 class Meta: 4 verbose_name_plural="出版社" 5 name=models.CharField("出版社名",default='',max_length=128) 6class Book(models.Model): 7 class Meta: 8 verbose_name_plural="本管理" 9 title=models.CharField('題名',max_length=128,unique=True) 10 publisher=models.ForeignKey(Publishs,default="",on_delete=models.PROTECT) 11 author=models.CharField("作者",max_length=128) 12 price=models.IntegerField("値段") 13 14---views--- 15class BoolList(ListView): 16 template_name="registration/bookreserch.html" 17 18 def get_queryset(self): 19 q_word=self.request.GET.get('query') 20 sample=self.request.GET.get('sample') 21 if sample=="title": 22 object_list=Book.objects.select_related("publisher").filter( 23 Q(title__icontains=q_word) 24 ) 25 return object_list 26 if sample=="author": 27 object_list=Book.objects.select_related("publisher").filter( 28 Q(author__icontains=q_word) 29 ) 30 return object_list 31 if sample=="publisher_name": 32 object_list=Book.objects.select_related("publisher").filter( 33 Q(publisher_name__icontains=q_word) 34 ) 35 return object_list 36 37---bookreserch.html--- 38{% extends 'base.html' %} {% block sample %} 39 40<div> 41 <form action="{% url 'bookreserch' %}" method="get"> 42 <input name="query" value="{{ request.GET.query }}" type="text"> 43 <button type="submit">検索する</button> 44 45<select name="sample"> 46 <option>-----</option> 47 <option value="title">題名</option> 48 <option value="author">作者</option> 49 <option value="publisher_name">出版社</option> 50 </select> 51 52 </form> 53 54</div> 55<div> 56 <table class="table"> 57 <thead> 58 <tr> 59 <th scope="col">題名</th> 60 <th scope="col">作者</th> 61 <th scope="col">値段</th> 62 <th scope="col">出版社</th> 63 </tr> 64 </thead> 65 <tbody> 66 {% for book in object_list %} 67 <tr> 68 <td>{{ book.title }}</td> 69 <td>{{ book.author }}</td> 70 <td>{{ book.price }}</td> 71 <td>{{ book.publisher.name }}</td> 72 </tr> 73 {% endfor %} 74 75 </tbody> 76 </table> 77 </table> 78 79</div> 80 81{% endblock %} 82 83---urls--- 84urlpatterns=[ 85 path('bookreserch',views.BoolList.as_view(),name="bookreserch") 86 ]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アンダーバーが足りないのだと思います。
外部キーの条件でフィルターする場合、

Python

1filter(外部キー列__外部テーブル列名=検索条件)

となります。アンダーバーは2つです。
今回のコードでは以下を修正すればよいかと。

修正前

Python

1Book.objects.select_related("publisher").filter(Q(publisher_name__icontains=q_word))

修正後

Python

1Book.objects.select_related("publisher").filter(Q(publisher__name__icontains=q_word))

ちなみにOR検索を行わないのであれば、Q() は不要です。

さらに修正後

Python

1Book.objects.select_related("publisher").filter(publisher__name__icontains=q_word)

投稿2021/09/23 15:03

gekijin

総合スコア187

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pappychamp

2021/09/23 16:52

修正した結果できました!! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問