2012-09-12 10 views
46

私のSolrインデックスでアクティビティレコードが古くなっているクエリを取得しようとしています。 データベース内のActivity.updatedの日付が同じレコードのActivity.added_toSolr_dateより大きいかどうかをチェックしたいと思います。サンプルのため https://docs.djangoproject.com/en/1.4/ref/models/querysets/ とユニットテスト:https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py同じモデルの2つの日付フィールドを比較するDjangoクエリーセットフィルタを作成する方法

もStackOverflowの上ここに検索

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") 

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

モデルは、私は、Djangoのクエリのドキュメントを参照しました。すべての例では、同じモデル内の2つの日付フィールドを比較する代わりに、入力された日付が使用されています。

答えて

107

F objects.

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

ありがとうございます!どうやってこれを発見したのですか? –

+3

@CarlosFerreira、毎年djangoを長年使っています。私はいつか言うことができません。 –

+0

すてきな解決策!ほぼ同じ質問を投稿しました – Ron

1

雄二富田の解決策は、残念ながら、動作しませんでした。

以下のモデルを検討:

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' %} 

を、私はもっとエレガントなソリューションを見ることを好むだろう。

+0

クイックセットフィルタとテンプレートコードの2つの異なることをすばやく読んでいます。前者では 'gte'を使用し、後者では '=='を使用しています。なぜ2人で同じ結果が得られないのですか?私は、 'my_other_date'がNone、自分自身である場合、なぜ 'mydate__exact = F( 'my_other_date')'をクエリに使用しないのか理解しようとしています。 – jenniwren

関連する問題