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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

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

Q&A

解決済

1回答

1532閲覧

[Django]querysetの重複を削除する。もしくはtemplateのタグ構成を工夫する。

noname0001

総合スコア16

Django

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

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

0グッド

0クリップ

投稿2019/04/16 06:58

編集2019/04/16 12:11

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での作業が可能になり次第記載します。

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

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

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

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

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

mtb_beta

2019/04/16 09:44

> 下記のようにすると当然テーブルの全ての行にdatetimeの全てのデータが表示されてしまいます。 とりあえず、この文章に出てくる「テーブル」という単語が、DBのテーブルなのか、HTMLのテーブルなのか分かりにくいと思いました。多分HTMLだと思いますので、わかりやすく書いた方が良さそうです。
mtb_beta

2019/04/16 09:47

「datetimeの全てのデータが表示されてしまいます。」とありますが、ここで言っているdatetimeってなんでしょうか? Pythonには、datetimeというモジュールやクラスがありますが、おそらく違うように見えます。 多分、Djangoのmodelにdatetimeというフィールドを追加しているのでだと思いますが、今の所、Djangoのmodelの情報が見えないので、よくわかりません。 Djangoのmodels.pyのコードも出す方が良いかと思います。
guest

回答1

0

自己解決

全く別の方法で解決しました。上記の方針での解決策は不明です。

投稿2019/04/28 10:35

noname0001

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問