web-dev-qa-db-ja.com

同じモデル内の2つの日付フィールドを比較するDjango querysetフィルターを作成する方法

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つの日付フィールドを比較する代わりに、入力された日付を使用しています。

63
Carlos Ferreira

Fオブジェクト

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

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

以下のモデルを検討してください。

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
Sergey Krivoy