前提・実現したいこと
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 ]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/23 16:52