如何创建比较同一模型中两个日期字段的Django查询集过滤器


80

尝试获取一个查询,其中“我的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 Query文档:https : //docs.djangoproject.com/en/1.4/ref/models/querysets/ 以及示例的单元测试:https : //github.com/django/django/blob/master/tests/ modeltests / or_lookups / tests.py

还在此处搜索Stackoverflow。所有示例都使用输入的日期,而不是比较同一模型中的两个日期字段。

Answers:


160

F对象。

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

非常感谢!您是怎么发现的?
卡洛斯·费雷拉

6
@CarlosFerreira,通过每天使用django的多年经验。我真的不能说什么时候。
Yuji'Tomita'Tomita 2012年

不错的解决方案!几乎发布了相同的问题
罗恩

谢谢!我一直在寻找!
Alex Santos

2
如果日期之一为NULL,这似乎失败。使用Q检查是否为空或比较,仍然失败。即使在MySQL中不会,其他人也看到了吗?
Paul Kenjora 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 %}

最后我得到一个空列表,但是我知道这是不正确的。我还在模板中使用了以下内容(没有queryset过滤器):

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

它有效,但是我希望看到一个更优雅的解决方案。


快速阅读后,您似乎在queryset过滤器和模板代码中做了两项不同的工作。在前者中,您使用“ gte”,而在后者中,您使用“ ==”。这就是为什么两者不能产生相同结果的原因吗?我试图弄清楚为什么mydate__exact = F('my_other_date')当“ my_other_date”为“无”时,我自己无法在查询中使用。
jenniwren

我有另一个原因为什么它不起作用。使用django-extensions TimeStampedModelcreatedupdated时间戳等于毫秒。延迟最小。我的快速解决方案是将其与第二个进行比较。
tschale
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.