查找Django当天发生的事件

时间:2015-10-15 04:43:27

标签: python django

我有一个人模型,人们可以找到工作:

class Person(models.Model):
    name = TextField()
    birth_date = DateField()

class Job(models.Model):
    name = TextField()
    start_date = DateField()
    person = ForeignKey('Person')

我想找一些在他们生日那天开始工作的人。

现在,如果我想找到那些开始完全生日的人,我会使用:

from django.db.models import F
Person.objects.filter(birth_date=F('job__start_date'))

但这不会让任何人失望,因为没有人被分配到他们出生的工作(希望如此)。

我可以找到4月1日开始工作的所有人:

Person.objects.filter(birth_date__month=4, birth_date__day=1)

但是,如果我尝试将这个结合起来找到在生日月份开始工作的人:

from django.db.models import F
Person.objects.filter(birth_date__month=F('job__start_date__month'))

我明白了:

FieldError at /data/explorer/
Cannot resolve keyword u'month' into field. Join on 'start_date' not permitted

如何找到在生日那天开始工作的人?

1 个答案:

答案 0 :(得分:1)

django目前不支持F表达式中日期(时间)字段的查找。还有一种方法,可能是hacky。

from django.db import connection
from django.db.models import F

start_month = connection.ops.date_extract_sql('month', '%s.start_date' % Job._meta.db_table)
start_day = connection.ops.date_extract_sql('day', '%s.start_date' % Job._meta.db_table)
birth_month = connection.ops.date_extract_sql('month', 'birth_date')
birth_day = connection.ops.date_extract_sql('day', 'birth_date')

# to trigger the join and make the job table available
# otherwise the next query will fail (there's probably a less hacky way to do this)
persons = Person.objects.filter(job=F('job__pk'))

persons.extra(
    {
        'start_month': start_month,
        'start_day': start_day,
        'birth_month': birth_month,
        'birth_day': birth_day
    },
    where=['start_day=birth_day AND start_month=birth_month']
)