【问题标题】:Django complex queriesDjango 复杂查询
【发布时间】:2011-06-08 16:56:51
【问题描述】:

我需要为检查日期范围的对象制作过滤器。现在我正在执行一个非常低效的循环来检查所有对象。我想将其简化为数据库调用。

逻辑是你有一个start 和一个end 日期对象。我需要检查开始或结束是否在约会范围内。

if (start >= appointment.start && start < appointment.end) || 
   (end > appointment.start && end <= appointment.end)

我可以在 SQL 中执行此操作,但我对更复杂查询的 Django 模型结构不太熟悉。

【问题讨论】:

    标签: python sql django model date


    【解决方案1】:

    & 和 OR 运算符以及 range 字段查找类型需要 Q 对象

    Q 对象:http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

    范围:http://docs.djangoproject.com/en/dev/ref/models/querysets/#range

    Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) | 
        Q(end__range=(appointment.start, appointment.end)))
    

    如果 SQL BETWEEN 不是您正在寻找的,您始终可以使用 Q 对象的特定组合来准确重现您的条件:

    Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) | 
       (Q(end__gt=appointment.start) & Q(end__lte=appointment.end)))
    

    【讨论】:

    • 使用第一个例子,你在哪里使用start_dateend_date
    • 对不起乔希!最初的示例直接来自文档,然后在以后的更新中我采用了您的特定变量:) 我将删除那些
    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2013-06-09
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多