2017-10-16 5 views
2

Je suis un débutant. J'aimerais que les employés de la liste aient plus de 25 ans et calculent l'âge moyen des employés. Actuellement, nous devons avoir l'âge d'anniversaire (je n'ai aucune idée à ce sujet ^^) . Aidez-moi à créer un exemple de QuerySet/Manager à ce sujet.Django QuerySet/Manager filtre les employés par âge d'anniversaire

Merci à tous :))

Mon modèle:

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) 

Note: Pas obtenir tous les employés et filtre des résultats. (results = Employee.objects.all()) et n'utilisez pas Raw SQL.

Répondre

0

de la date d'importation datetime de dateutil.relativedelta relativedelta importation

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

que 25 ans Expected + 1 jour suffit. La fonction relativedelta est utilisée en raison de l'année bissextile, pour ne pas augmenter l'exception ValueError bientôt le 29/02/2020.

+0

Merci, je l'ai appliquée pour obtenir employé de liste ont l'âge> 25, que diriez-vous * calculer l'âge moyen des employés *? – WorkWe

+0

Je ne me souviens pas d'une solution exacte moderne par [Query Expressions] (https://docs.djangoproject.com/fr/1.11/ref/models/expressions/), mais je suis sûr qu'il existe. Une solution classique est de combiner enfin Django avec l'évaluation Python. Peut-être 'Avg ('date de naissance')' si possible ou de calculer la moyenne au 1er Janvier sans fractions d'âge ('Avg ('date de naissance__year')' ou moyenne date Julian etc. – hynekcer

+0

'Avg ('date de naissance__year')' pas juste dans Dans certains cas, nous devrions connaître l'âge exact pour utiliser Avg. Merci pour votre soutien, je rechercherai plus. – WorkWe

1

Si vous êtes à la recherche de gestionnaires personnalisés, voici une suggetion.

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 

Ensuite, utilisez

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)