我有一个人模型,人们可以找到工作:
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
如何找到在生日那天开始工作的人?
答案 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']
)