2016-08-22 7 views
1

DateTimeFielddate_createdという名前のモデル(「ジョブ」を表す)があります。私はと呼ばれる別のものを持っていますdate_modifiedDjango - Datetimeの代わりに日付別にクエリセットをソート

-date_modified私は最も最近修正された 'jobs'が私のリストの先頭になるように並べ替えたいと思います。問題は、複数の実行中のジョブが、タイムスタンプが更新されるたびに並べ替えられ続けることです。 date_modifiedフィールドがDateFieldのようにソートされている場合は、「今日」に変更されたすべての「ジョブ」をソートして、date_createdなどの第2の値を並べ替えることができますタイムスタンプが変更されるとリスト内の場所は変更されません。

これは私が今持っているものです。

queryset = DataCollection.objects.all().order_by('-date_modified','-date_created') 

私は、関連記事を見つけましたが、バージョン1.9で古いようだ: Django sorting by date(day)

UPDATE

私は現在の修正をこれを見てください:

queryset = DataCollection.objects.all().extra(select = 
{'custom_dt': 'date(date_modified)'}).order_by('-custom_dt','-date_created') 

これは@lampslaveが示唆していたものに最も似ていますが、extraメソッドを使用しています。これは将来廃止される予定です...私はいつでもすぐに後のバージョンのDjangoにアップグレードする予定はありませんが、私の胃が少し不安定になります。

+0

を助けるかもしれないと思います日時の日付は、日時がどのタイムゾーンにあるかによって決まります。 –

+0

良い点。なぜTimeTimeFieldのタイムゾーン情報が含まれていないのですか? – Dan

+0

タイムゾーンを意識して作業している場合、タイムゾーンは通常、プレゼンテーション層に属するとみなされます。 DateTimesは内部的にはUTCで、できるだけ遅く変換する必要があります。 https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/ –

答えて

2

この場合、ビューセットでクエリセットをソートします。手引き/ソートドキュメントで説明あなたが使用できる2つのキーattrgetter、ソートする

sorted(DataCollection.objects.all(), key = lambda x: x.date_modified.date(), reverse = True) 

。データベースがdatetime_to_date変換をサポートしている場合

+0

これは非常に優れた方法ですが、私はDjangoのDRFルーティングに問題があり、 "no base_name"エラーが発生しました。何らかの理由でリストを返すことができないため、今はクエリ自体ですべてを実行しようとしています。 – Dan

+1

1.10の場合は、Cast(https://docs.djangoproject.com/en/1)で何かできることがあります。10/ref/models/database-functions /#cast)または新しい日付関数(https://docs.djangoproject.com/en/1.10/ref/models/database-functions/#module-django.db .models.functions.datetime)。私は1.9.xになっているので、実用的な経験はありません。 – souldeux

+0

私は1.8を使用していますので、いくつかのオプションが出てきました。私は、将来の正しい答えは、それが利用可能になるたびに__dateを使うことだと思います。 – Dan

0

することは、あなたはこのような何か試すことができます。

DataCollection.objects.all().annotate(date_created__date=RawSQL('DATE(date_created)',())).order_by('-date_created__date') 
+0

これはほぼ正しいと思われますが、私はRaw SQLクエリを使用しないようにこれを行う純粋な "Django"方法があるように感じます。すべてのデータベースのdatetimefield - > datefield変換はありませんか? DjangoにAPIを公開しながら、これをフードの下で行ういくつかの方法がありますか? – Dan

+0

souldeuxの答えに対するコメントを見るRawSQLの代わりに新しい式や関数を使用してみてください。 – lampslave

+0

「新しい表現」とはどういう意味ですか? – Dan

0

を私はsouldeux答えはおそらくこれよりも多くの滑らかな印象ですが、別の解決策は、それらを一緒に参加し、その後個別に照会することができると思います。私は注意してください、その後、これらの線に沿って何か

from itertools import chain 
import datetime 

# get just todays data ordered by date modified 
today_min = datetime.datetime.combine(datetime.date.today(), datetime.time.min) 
today_max = datetime.datetime.combine(datetime.date.today(), datetime.time.max) 
data_set1 = DataCollection.objects.filter(date_modified__range=(today_min, today_max)).order_by('-date_modified') 

# get the rest of the data 
data_set2 = DataCollection.objects.all().exclude(date_modified__range=(today_min, today_max)).order_by('-date_created') 

# join it all together 
all_list = list(chain(data_set1, data_set2)) 

私はDjangoはそれがまだ利用可能な場合、私は知らない__dateクエリセレクタを導入することを計画していたと思いますが、あなたがタイムゾーンを使用している場合、それはまた

関連する問題