質問するログイン新規登録

Q&A

解決済

1回答

133閲覧

django ドロップダウンリストで日付データを並び替えしたい

hokkai

総合スコア1

Django

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

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

1グッド

0クリップ

投稿2026/03/19 02:51

1

0

実現したいこと

django-filterで文字列型日付データのドロップダウンを並び替えしたい

発生している問題・分からないこと

django-filterでpostgresqlのテーブルを一覧表示したフォームでレコード選択用のドロップダウンを設置しておりますが、文字列型の日付データのため並び替えが出来ておりません。このような場合に並び替えする方法を知りたいです。

該当のソースコード

Python

1# モデル 2# myapp/models.py 3 4from django.db import models 5 6class Db11(models.Model): 7 hiduke = models.CharField(max_length=10, verbose_name='日付') 8 koujyou = models.CharField(max_length=255, verbose_name='工場') 9 ~省 略~ 10 def __str__(self): 11 return self.hiduke

Python

1# フィルター 2# myapp/filters.py 3 4import django_filters 5import datetime 6from .models import Db11 7 8class Db11hidukeFilter(django_filters.FilterSet): 9 hiduke = django_filters.ModelChoiceFilter( 10 queryset=Db11.objects.all().order_by('hiduke').distinct('hiduke')) 11 class Meta: 12 model = Db11 13 fields = ['hiduke']

Python

1# フォーム 2# myapp/forms.py 3 4from django import forms 5from .models import Db11 # ここを追加 6 7class Db11Form(forms.ModelForm): 8 class Meta: 9 model = Db11 10 fields = ['hiduke', 'koujyou', 'kaisya', 'genba', 'koujyouwatashi', 'syurui', 'suuryou', 'motikaeri', 'kigou', 'haikan', 'yobi', 'cement', 'kotsuzai', 'slump', 'jis', 'jyuryou', 'nkeisan', 'n', 'doken', 'kanmin', 'daikou', 'bikou']

Python

1# ビュー 2# myapp/views.py 3 4from django.shortcuts import render, redirect, get_object_or_404 5from .models import Db11 6from .forms import Db11Form 7from .filters import Db11hidukeFilter 8#from django_tables2 import SingleTableView 9#from .tables import Db11Table 10 11# 一覧表示 12def db11_list(request): 13# db11s = Db11.objects.all() 14 db11s = Db11hidukeFilter(request.GET, queryset=Db11.objects.all()) 15 return render(request, 'myapp/db11_list.html', {'filter': db11s}) 16 ~省 略~

Python

1<!-- templates/myapp/db11_list.html --> 2<h1>出荷一覧</h1> 3<a href="{% url 'db11_create' %}">新規登録</a> 4<form method="get"> 5 {% csrf_token %} 6 {{ filter.form.as_p }} 7 <input type="submit" /> 8</form> 9<table class="table table-striped table-responsive"> 10 <tr> 11 <th>ID</th> 12 <th>日付</th> 13 <th>工場</th> 14   ~ 省 略 ~ 15 </tr> 16 <tr> 17 {% for db11 in filter.qs %} 18 <th>{{ db11.id }}</th> 19 <td>{{ db11.hiduke }}</td> 20 <td>{{ db11.koujyou }}</td> 21   ~ 省 略 ~ 22 <th> 23 <a href="{% url 'db11_update' db11.pk %}">Edit</a> 24 </th> 25 <th> 26 <form action="{% url 'db11_delete' db11.pk %}" style="display:inline;"> 27 <button type="submit">Delete</button> 28 </form> 29 </th> 30 </tr> 31 {% endfor %} 32</table>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

queryset=Db11.objects.all().order_by('hiduke').distinct('hiduke'))
このhidukeカラムをStringからDate型にすれば良いのではと思っているのですが
実現方法がわかりません

補足

開発PC Windows 11 Pro
IDE   Visual Studio Community 2026
サーバー ubuntu 22.04 LTS
Python 3.12.3
Postgresql 18

melian👍を押しています

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

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

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

winterboum

2026/03/20 06:38

Django の人でも python の人でもないのですが、、、 「文字列型の日付データのため並び替えが出来ない」とのことですが、 もしかして 和暦? 西暦でも 「月日1桁の時に 0とか空白とかで桁数調節していない」 ってことかな
hokkai

2026/03/20 07:27

winterboumさん ’2026/3/20’ ’2025/4/2’ ’2025/10/1’ というようなcsvデータから取り込んだpostgresql文字列型カラムなのです ドロップダウンリストでの表示も ’2026/3/20’ ’2025/4/2’ ’2025/10/1’ となってしまっています
melian

2026/03/20 09:57

DBがPostgreSQLでしたら、to_date関数でキャストすれば良いかもしれません。 from django.db.models import Func, Value, DateField queryset = Db11.objects.annotate( datetype_date = Func('hiduke', Value('YYYY/MM/DD'), function='to_date', output_field=DateField()) ).order_by('datetype_date') 手元に Dojango フレームワークがないので動作確認をしていませんが、参考までにどうぞ。
hokkai

2026/03/20 10:10

melianさん queryset=Db11.objects.annotate( datetype_date = Func('hiduke', Value('YYYY/MM/DD'), function='to_date', output_field=DateField()) ).order_by('datetype_date').distinct('datetype_date')) にて並び替えが出来ました ありがとうございました
hokkai

2026/03/20 10:21

コメントありがとうございます。問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
guest

回答1

0

ベストアンサー

※ 質問へのコメントを転記

DBがPostgreSQLでしたら、to_date関数でキャストすれば良いかもしれません。

python

1from django.db.models import Func, Value, DateField 2 3queryset = Db11.objects.annotate( 4 datetype_date = Func('hiduke', Value('YYYY/MM/DD'), function='to_date', output_field=DateField()) 5).order_by('datetype_date').distinct('datetype_date'))

ですが、この場合、ドロップダウン表示を行う度にDB(PostgreSQL)でto_date関数が実行されることになりますので、データ量によってはDBに負荷が掛かる状況になるかもしれません。
なので、DBへのインサート時に日付データ(文字列)をDate型に変換する方がよいかと思います。そうすれば上記の変更は不要になります。

投稿2026/03/20 10:32

melian

総合スコア21722

hokkai

2026/03/20 10:44

> DBへのインサート時に日付データ(文字列)をDate型に変換する方がよいかと思います。 ありがとうございます csvからの取込の際に型変換出来ないか調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問