Django日期过滤器按日期过滤

Mar*_*ark 4 python django

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

posts = TodaysObject.objects.filter(publish_date__day=now.day, publish_date__month=now.month)
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

posts = TodaysObject.objects.filter(publish_date__day__lte=now.day, publish_date__month=now.month)
Run Code Online (Sandbox Code Playgroud)

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

jac*_*ack 7

试试这个:

选项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)
Run Code Online (Sandbox Code Playgroud)

选项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)
Run Code Online (Sandbox Code Playgroud)

使用extra()函数:

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

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