同じモデルの2つの日付フィールドを比較するDjangoクエリセットフィルターを作成する方法


82

Solrインデックスでアクティビティレコードが古くなっているクエリを取得しようとしています。Activity.updatedデータベースの日付がActivity.added_toSolr_date同じレコードの日付よりも大きいかどうかを確認したいと思います。

stale_activities_queryset = Activity.objects.filter(updated__gte = self.added_toSolr_date) 

モデル

class Activity(models.Model):
    # Last time entry / metric was updated in the Activity model database
    updated =  models.DateTimeField( verbose_name="CRUD date")
    # When it was added to Solr Index Date
    added_toSolr_date = models.DateTimeField(blank=True, null=True, verbose_name="Added to Solr Index Date")

私は、Djangoのクエリのドキュメントを参照: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ そしてサンプルのためのユニットテスト: https://github.com/django/django/blob/master/tests/ modeltests / or_lookups / tests.py

Stackoverflowでもここを検索しました。すべての例では、同じモデルの2つの日付フィールドを比較する代わりに、入力された日付を使用しています。

回答:


162

Fオブジェクト。

from django.db.models import F
stale_activities = Activity.objects.filter(updated__gte=F('added_toSolr_date')) 

本当にありがとう!どうやってこれを発見したのですか?
カルロスフェレイラ

6
@CarlosFerreira、何年にもわたってdjangoを毎日使用しています。いつなのかよくわかりません。
ゆうじ「冨田」冨田

素晴らしい解決策!ほぼ同じ質問を投稿しました
Ron

ありがとう!これを探していました!
Alex Santos

2
日付の1つがNULLの場合、これは失敗するようです。Qを使用してnullをチェックするか、比較しても失敗します。MySQLにはありませんが、他の誰かがこれを見ていますか?
ポールケンジョラ2015

3

残念ながら、富田雄二の解決策はうまくいきませんでした。

以下のモデルを考えてみましょう。

class list(models.Model):
    text = models.CharField(max_length=140)
    created = models.DateTimeField()
    modified = models.DateTimeField()

クエリセット:

my_list = todolist.objects.order_by('created').filter(created__gte=F('modified'))

テンプレート:

{% if my_list %}
{% for list in my_list %}
{{ list.text}}
{% endfor %}
{% else %}
<p>there is no list</p>
{% endif %}

結局、私は空のリストを取得しますが、それは正しくありません。テンプレート内で(クエリセットフィルターなしで)以下も使用しました。

{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %}

それはうまくいきましたが、私はもっとエレガントな解決策を見たいと思います。


簡単に読むと、クエリセットフィルターとテンプレートコードで2つの異なることをしているように見えます。前者では「gte」を使用し、後者では「==」を使用しています。これが、2つが同じ結果を生成しない理由ですか?mydate__exact = F('my_other_date')'my_other_date'がNoneの場合、クエリでの使用が機能しない理由を理解しようとしています。
jenniwren 2016年

それがうまくいかない別の理由がありました。を使用django-extensions TimeStampedModelするcreatedと、updatedタイムスタンプとタイムスタンプはミリ秒まで等しくなります。最小限の遅延があります。私の簡単な修正は、それを秒単位で比較することでした。
tschale
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.