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

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

我怎样才能找到在生日那天开始工作的人?

最佳答案

django当前不支持查找F表达式中的日期(时间)字段。还是有办法的,尽管有点老套。

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']
)

07-24 21:47