2012-09-12 41 views
46

尝试在我的Solr索引中获取活动记录陈旧的查询。 我想检查数据库中的Activity.updated日期是否大于同一记录的Activity.added_toSolr_date如何创建一个Django查询集过滤器,比较同一模型中的两个日期字段

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

也搜寻这里#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

快速阅读它看起来像你在查询集过滤器和我们的模板代码中做了两件不同的事情。前者使用'gte',后者使用'=='。这就是为什么这两个不会产生相同的结果?我试图弄清楚为什么在'my_other_date'是None时,在查询中使用'mydate__exact = F('my_other_date')'不起作用。 – jenniwren

相关问题