Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django QuerySet/经理从生日起按年龄筛选员工_Python_Django_Django Queryset - Fatal编程技术网

Python Django QuerySet/经理从生日起按年龄筛选员工

Python Django QuerySet/经理从生日起按年龄筛选员工,python,django,django-queryset,Python,Django,Django Queryset,我是初学者。我想列出年龄>25岁的员工名单,并计算员工的平均年龄。目前,我们需要从生日开始计算年龄(我不知道^^) . 请帮助我创建关于它的示例QuerySet/Manager 谢谢大家:) 我的模型: class Employee(models.Model): """"Employee model""" first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30

我是初学者。我想列出年龄>25岁的员工名单,并计算员工的平均年龄。目前,我们需要从生日开始计算年龄(我不知道^^) . 请帮助我创建关于它的示例QuerySet/Manager

谢谢大家:)

我的模型:

class Employee(models.Model):
""""Employee model"""

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    birthday = models.DateField(max_length=8)
注意:不获取所有员工并从结果中筛选。(
results=Employee.objects.all()
)并且不使用原始SQL

from datetime import date
from dateutil.relativedelta import relativedelta

qs = Employee.objects.filter(birthdate__gt=date.today() - relativedelta(years=+25))

预计25年+1天就足够了。由于闰年的原因,在2020年2月29日使用了函数
relativedelta
,以避免引发ValueError异常。

如果您正在寻找定制经理,这里有一个建议

import datetime
from django.db import models

# Create your models here.


class EmployeeManager(models.Manager):
    def get_queryset(self):
        return super(EmployeeManager, self).get_queryset()

    def get_queryset_age_greater_25(self):
        # The `iterator()` method ensures only a few rows are fetched from the database at a time, saving memory.
        ids = [obj.id for obj in self.get_queryset().iterator() if obj.find_age() > 25]
        return self.get_queryset().filter(id__in=ids)

    def get_avg(self):
        sum_, count = sum(
            map(lambda obj: obj.find_age(), self.get_queryset_age_greater_25().iterator())), self.get_queryset_age_greater_25().count()
        return sum_/count


class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    birthday = models.DateField(max_length=8)
    objects = EmployeeManager()

    def find_age(self):
        return datetime.date.today().year - self.birthday.year
然后使用

Employee.objects.get_queryset_age_greater_25() # to get employee objects having age greater than 25)
Employee.objects.get_avg() # to get avg age of employees having age greater than 25)

谢谢,我已经将其应用于列出年龄>25岁的员工,如何计算员工的平均年龄?我不记得有一个现代的精确解,但我确信它是存在的。一个经典的解决方案是最终将Django与Python计算结合起来。可能
Avg('birthdate')
如果可能的话,或者计算到1月1日的平均值,不带年龄分数(
Avg('birthdate\u年')
或平均朱利安日期等
Avg('birthdate\u年'))
在某些情况下不正确,我们应该知道使用Avg的确切年龄。感谢您的支持,我将进行更多研究。您可以在此处发布您的答案,因为最好的答案已被淘汰。