【问题标题】:How to create a Django queryset filter comparing two date fields in the same model如何创建一个 Django 查询集过滤器比较同一模型中的两个日期字段
【发布时间】:2012-09-05 00:24:53
【问题描述】:

尝试查询我的 Solr 索引中的 Activity 记录是否过时。 我想检查数据库中的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 上搜索过。所有示例都使用输入的日期,而不是比较同一模型中的两个日期字段。

【问题讨论】:

    标签: django django-queryset


    【解决方案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' %}
    

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

    【讨论】:

    • 快速阅读,您似乎在查询集过滤器和我们的模板代码中做了两件不同的事情。前者你使用'gte',后者你使用'=='。这就是为什么两者不产生相同的结果?我试图弄清楚为什么我自己在 'my_other_date' 为 None 时在查询中使用 mydate__exact = F('my_other_date') 不起作用。
    • 我还有另一个原因让它不起作用。使用django-extensionsTimeStampedModelcreatedupdated 时间戳等于毫秒。有一个最小的延迟。我的快速解决方法是将其与第二个进行比较。
    【解决方案2】:

    F objects.

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

    【讨论】:

    • @CarlosFerreira,多年来每天都在使用 django。我真的不能说什么时候。
    • 不错的解决方案!几乎发布了相同的问题
    • 谢谢!我在找这个!
    • 如果日期之一为 NULL,这似乎会失败。使用 Q 检查 null 或比较,但仍然失败。即使它不会在 MySQL 中,还有其他人看到这个吗?
    • @PaulKenjora 另一种选择是首先查询并过滤掉任何日期为空的内容,然后再次过滤以进行日期比较?或者您是否需要在结果中包含空日期?
    猜你喜欢
    • 2021-01-02
    • 2013-10-10
    • 2017-05-28
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多