Django日期按月日筛选

2024-05-13 21:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要编写一个查询,返回小于或等于某个月的某一天的所有对象。今年不重要。很容易在特定的日期/月获取对象(假设now = datetime.datetime.now()):

posts = TodaysObject.objects.filter(publish_date__day=now.day, publish_date__month=now.month)

但我做不到:

posts = TodaysObject.objects.filter(publish_date__day__lte=now.day, publish_date__month=now.month)

似乎Django认为我在组合多个字段查找时试图进行联接(publish_date__day__lte)。在Django最好的方法是什么?


Tags: 对象django方法datetimedateobjectsfilterpublish
3条回答

试试这个:

选项1:

from django.db.models import Q

datafilter = Q()
for i in xrange(1, now.day+1):
    datafilter = datafilter | Q(publish_date__day=i)
datafilter = datafilter & Q(publish_date__month=now.month)
posts = TodaysObject.objects.filter(datafilter)

选择2:

执行原始sql查询:

def query_dicts(query_string, *query_args):
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute(query_string, query_args)
    col_names = [desc[0] for desc in cursor.description]
    while True:
        row = cursor.fetchone()
        if row is None:
            break
        row_dict = dict(izip(col_names, row))
        yield row_dict
    return
posts = query_dicts('SELECT * FROM tablename WHERE DAY(publish_date)<=%s AND MONTH(publish_date)=%s', now.day, now.month)

使用extra()函数:

posts = TodaysObject.objects.extra([where='DAY(publish_date)<=%d AND MONTH(publish_date)=%d' % (now.day, now.month)])

假设您使用的是MySQL。对于PostgreSQL,需要分别将日(publish_date)和月(publish_date)更改为date_PART('DAY',publish_date)和date_PART('MONTH',publish_date)。

now = datetime.date.today()
post = TodaysObject.objects.raw("SELECT * FROM (app_name)_todaysobject WHERE DAY(publish_date) =%(day)d AND MONTH(publish_date)=%(month)d" %{'day' : today.day, 'month':today.month} )

它并不总是可以从一个数据库引擎移植到另一个数据库引擎,但是您可能需要查看extra()queryset方法。

from django docs

这允许您注入原始sql来构造比django queryset api更复杂的查询。

如果您的应用程序需要移植到不同的数据库引擎,您可以尝试重新构造,以便拥有日、月和年整数字段。

相关问题 更多 >