Django2.1.7
Python3.7
[やりたいこと]
IDで関連づいた2つのDBテーブル(Reportテーブル、Datetimeテーブル)の内、片方を指定の条件でfilterし、それにより取得したIDでもう片方のDBテーブルの情報をfilterします。
画面にはそれぞれのDBテーブルから取得したデータの、対応する行を横並びに結合して表示したいです。
[問題]
下記のように試しているのですが、chain()を使用すると(下記ではコメントアウトしています)両方のDBテーブルに同じID(application_id。Reportテーブルのprimary key、DatetimeテーブルのForeign key)が存在するため、IDのみ重複して2回ずつ同じものが表示されてしまいます。
[試したこと]
chain()を使用せずにtemplateでタグの構成を工夫して表示させようとしたのですが、下記のようにすると当然HTMLのtableの全ての行にDatetimeテーブルから取得した全てのフィールドが表示されてしまいます。
何か良い方法はありますか?
重複しているIDをQuerysetから削除するか、templateのタグの構成を工夫して実装可能かと考えています。
views
1... 2 queryset_report = Report.objects.filter(datetime__plan_start_datetime__range=(start_datetime, end_datetime)) 3 queryset_datetime = Datetime.objects.filter(application_id__in=queryset_report) 4 # queryset_chained = chain(queryset_report, queryset_datetime) 5...
views
1... 2 context = { 3 'search_keywords': search_keywords, 4 'start_datetime': start_datetime, 5 'end_datetime': end_datetime, 6 'queryset_report': queryset_report, 7 'queryset_datetime': queryset_datetime, 8 #'queryset_chained': queryset_chained, 9 'verbose_name_list': verbose_name_list, 10 'export_filepath': None, 11 } 12...
template
1... 2<table> 3 <thead> 4 <tr> 5 {% for verbose_name in verbose_name_list %} 6 <th>{{ verbose_name }}</th> 7 {% endfor %} 8 </tr> 9 </thead> 10 <tbody> 11 <!-- 12 {# {% for q in queryset_chained %} #} 13 <tr> 14 <td>{{ q.application_id }}</td> 15 <td>{{ q.lunch_preparation_flag }}</td> 16 <td>{{ q.invoice_or_receipt }}</td> 17 <td>{{ q.total_price_of_lunch }}</td> 18 <td>{{ q.billing_state }}</td> 19 <td>{{ q.datetime.plan_start_datetime }}</td> 20 <td>{{ q.datetime.plan_end_datetime }}</td> 21 <td>{{ q.datetime.actual_start_datetime }}</td> 22 <td>{{ q.datetime.actual_end_datetime }}</td> 23 </tr> 24 {# {% endfor %} #} 25 --> 26 {% for qr in queryset_report %} 27 <tr> 28 <td>{{ qr.application_id }}</td> 29 <td>{{ qr.lunch_preparation_flag }}</td> 30 <td>{{ qr.invoice_or_receipt }}</td> 31 <td>{{ qr.total_price_of_lunch }}</td> 32 <td>{{ qr.billing_state }}</td> 33 {% for qd in queryset_datetime %} 34 <td>{{ qd.plan_start_datetime }}</td> 35 <td>{{ qd.plan_end_datetime }}</td> 36 <td>{{ qd.actual_start_datetime }}</td> 37 <td>{{ qd.actual_end_datetime }}</td> 38 {% endfor %} 39 </tr> 40 {% endfor %} 41 42 </tbody> 43</table> 44...
[追記]
下記のように書き換えることで、HTMLのtableにIDが重複して表示されることがなくなりました。
views
1... 2 queryset_report = Report.objects.filter(datetime__plan_start_datetime__range=(start_datetime, end_datetime)) 3 queryset_datetime = Datetime.objects.filter(application_id__in=queryset_report) 4 queryset_chained = chain(queryset_report, queryset_datetime) 5...
views
1... 2 context = { 3 'search_keywords': search_keywords, 4 'start_datetime': start_datetime, 5 'end_datetime': end_datetime, 6 'queryset_report': queryset_report, 7 'queryset_datetime': queryset_datetime, 8 'queryset_chained': queryset_chained, 9 'verbose_name_list': verbose_name_list, 10 'export_filepath': None, 11 } 12...
template
1... 2<table> 3 <thead> 4 <tr> 5 {% for verbose_name in verbose_name_list %} 6 <th>{{ verbose_name }}</th> 7 {% endfor %} 8 </tr> 9 </thead> 10 <tbody> 11 12 {% for q in queryset_chained %} 13 <tr> 14 <td>{{ q.datetime.application_id }}</td> 15 <td>{{ q.lunch_preparation_flag }}</td> 16 <td>{{ q.invoice_or_receipt }}</td> 17 <td>{{ q.total_price_of_lunch }}</td> 18 <td>{{ q.billing_state }}</td> 19 <td>{{ q.datetime.plan_start_datetime }}</td> 20 <td>{{ q.datetime.plan_end_datetime }}</td> 21 <td>{{ q.datetime.actual_start_datetime }}</td> 22 <td>{{ q.datetime.actual_end_datetime }}</td> 23 </tr> 24 {% endfor %} 25 26 <!-- 27 {# {% for qr in queryset_report %} #} 28 <tr> 29 <td>{{ qr.application_id }}</td> 30 <td>{{ qr.lunch_preparation_flag }}</td> 31 <td>{{ qr.invoice_or_receipt }}</td> 32 <td>{{ qr.total_price_of_lunch }}</td> 33 <td>{{ qr.billing_state }}</td> 34 {% for qd in queryset_datetime %} 35 <td>{{ qd.plan_start_datetime }}</td> 36 <td>{{ qd.plan_end_datetime }}</td> 37 <td>{{ qd.actual_start_datetime }}</td> 38 <td>{{ qd.actual_end_datetime }}</td> 39 {# {% endfor %} #} 40 </tr> 41 {% endfor %} 42 --> 43 </tbody> 44</table> 45...
しかし、重複分の行は作成され、仮にデータが3行の場合、空の行が3行できてしまいます…
{% for q in queryset_chained %}の下に、querysetがNoneでない場合のみ行を作るようにifで分岐するとよさそうですが、下記のようにしても結果は変わりませんでした。
{% for q in queryset_chained %} {% if q != None %} <tr> <td>{{ q.datetime.application_id }}</td> <td>{{ q.lunch_preparation_flag }}</td> <td>{{ q.invoice_or_receipt }}</td> <td>{{ q.total_price_of_lunch }}</td> <td>{{ q.billing_state }}</td> <td>{{ q.datetime.plan_start_datetime }}</td> <td>{{ q.datetime.plan_end_datetime }}</td> <td>{{ q.datetime.actual_start_datetime }}</td> <td>{{ q.datetime.actual_end_datetime }}</td> </tr> {% endif%} {% endfor %}
どのように判定すれば良いでしょうか?
mtb_betaさん
ご指摘頂きありがとうございました。
急いでいたため、テーブルの表現など曖昧になってしまいました。
Webアプリの開発に関しましては、分からない部分も多く、余計に分かり辛い文章となっていると思います。申し訳ありません。
models.pyはPCでの作業が可能になり次第記載します。
回答1件
あなたの回答
tips
プレビュー