【发布时间】:2021-08-17 17:44:58
【问题描述】:
我有一个 Django 类,用于将模型中的出生日期 (dob) 字段转换为年龄并将结果注释到查询集。
class CalculateAge(Case):
def __init__(self, model, field, condition=None, then=None, **lookups):
today = date.today()
obj = model.objects.first()
field_object = model._meta.get_field(field)
field_value = field_object.value_from_object(obj)
bornyear = field_value.year
bornmonth = field_value.month
bornday = field_value.day
# something is wrong with the next two lines
age = [today.year - bornyear - ((today.month, today.day) < (bornmonth, bornday))]
return super().__init__(*age, output_field=IntegerField())
但是当我尝试将结果传递给我的查询集时
queryset = Person.objects.all().annotate(age=CalculateAge(Person, 'dob')
我得到了错误
Positional arguments must all be When objects.
我怎样才能让它工作?
【问题讨论】:
-
我不明白你在做什么。 CalculateAge 是一个扩展 Case 的类,但您可以像使用返回数字的函数一样使用它。您确定要让 CalculateAge 成为一个类并且确定要扩展 Case?
-
大小写不是强制性的。对任何可用于填充注释值“age”的实现开放
标签: python django django-models django-queryset django-annotate