2014-10-02 63 views
1

我对Django比较陌生,对Django Querysets也不熟悉。 我想根据一个字段筛选日期时间范围内的查询集。 在MySQL中,我会做基于Django中的字段的动态范围过滤器

​​

这里START_TIME是一个日期和持续时间是在几分钟时间一个int。

我该如何在便携式的Django中做到这一点?我知道我总是可以使用extra,但我更喜欢它可以在MySQL和Sqlite3中使用。看起来这些数据库管理员不共享任何日期时间功能。

+0

这是一个相关的问题:http://stackoverflow.com/questions/18555247/django-time-difference-with-f-object – jamesc 2014-10-02 17:40:05

回答

0

你可以用“F”在查询表达式引用过滤器表达式中的模型的领域(见https://docs.djangoproject.com/en/dev/topics/db/queries/#using-f-expressions-in-filters

这意味着,在过滤器中,它可能说“这里time_atime_b之前”任何特别一行:

filter(time_a__lt=F('time_b') 

然而,问题的产生是因为,按照this related questiontimedelta不会接受动态F()表达......所以它看起来像需要自定义的SQL。不过,您可以在Django中自动测试sqlite和mysql,以断言它可以在两者上运行。

同时,避免自定义SQL的特别脏的解决方案是将start_time转换为Unix时间,这使得数学变得简单。

from calendar import timegm 
from datetime import timedelta 

from django.db import models 
from django.db.models import F 
from django.utils.timezone import now 


class Journey(models.Model): 
    name = models.CharField(max_length=64) 
    start_time = models.IntegerField() 
    duration_minutes = models.IntegerField() 


def current_journeys(): 
    unow = timegm(now().utctimetuple()) 
    q = Journey.objects.filter(start_time__gt=unow-60*F('duration_minutes')) 
    return q.all() 
+0

刚刚测试此使用'django.test.TestCase'和它的工作原理与sqlite3和mysql引擎。 – jamesc 2014-10-02 12:26:46

+0

就我而言,这不是一个固定的范围。它取决于持续时间字段,该字段对数据库中的每一行都有所不同。这就是我明确说明start_time和duration类型的原因。 – 2014-10-02 13:57:37

+0

我可能不得不以完全避免这个问题的方式来解决我的问题,但很高兴知道这是否可行。 – 2014-10-02 14:01:03

相关问题