【问题标题】:Django convert Date of Birth model field to AgeDjango将出生日期模型字段转换为年龄
【发布时间】: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


【解决方案1】:

有一个更简单的方法。只需在您的模型上添加一个函数即可获得这样的年龄:

class ModelName(models.Model):
    birth_date = models.DateField()
    #other fields

    def get_age(self):
        age = datetime.date.today()-self.birth_date
        return int((age).days/365.25)

【讨论】:

  • 这只是一个近似值。例如,如果 age.days == 365,即使您 1 岁,此函数也会返回 0。
  • 您可以删除int 或四舍五入...这取决于您到底需要什么。
  • 如果age.days == 364,你还会四舍五入吗? 2000年呢?那不是闰年。
  • 就像我说的,取决于你需要什么。但在大多数情况下都可以。
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多