Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как выбрать людей, согласно их возрасту? [RSS Feed]

#1 Апрель 27, 2010 00:57:42

tezro
От:
Зарегистрирован: 2009-12-09
Сообщения: 90
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выбрать людей, согласно их возрасту?

Привет всем. Сразу к делу.

Берём самую простую моедель:

class Human(models.Model):
birth_date = models.DateField()
Задача: написать queryset для выборки всех людей, старше 20 лет и младше 30.

Подсказки: timedelta не знает о существовании годов; вычитание годов для подстановки в условие выборки не учитываыет людей, которым уже исполнилось 30, тем более не учитывает високосные года; создать readonly поле, которое обновляется постоянно при обращении к объекту (в поле пишется расчётный возраст) - слишком затратный, хотя и удобный вариант.

Есть идеи?



Отредактировано (Апрель 27, 2010 13:41:20)

Офлайн

#2 Апрель 27, 2010 01:20:06

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Как выбрать людей, согласно их возрасту?

from django.db.models import Q
min_age = 20
max_age = 30
min_age_ago = datetime.now - min_age
max_age_ago = datetime.now - max_age
humans = Human.objects.filter(Q(birthday__lte=min_age_ego) & Q(birthday__gte=max_age_ego))
Не проверял.

Отредактировано (Апрель 27, 2010 01:21:12)

Офлайн

#3 Апрель 27, 2010 13:50:10

tezro
От:
Зарегистрирован: 2009-12-09
Сообщения: 90
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выбрать людей, согласно их возрасту?

Ferroman
min_age_ago = datetime.now - min_age max_age_ago = datetime.now - max_age
Ну в теории - всё верно. Но я проверял.

tezro
не учитываыет людей, которым уже исполнилось 30
То есть если вычтем 30 лет от текущей даты, например получим 27 апреля 1980-го года, то в выборку не попадут те, у кому 26-го апреля исполнилось 30.



Офлайн

#4 Апрель 27, 2010 14:23:40

tezro
От:
Зарегистрирован: 2009-12-09
Сообщения: 90
Репутация: +  0  -
Профиль   Отправить e-mail  

Как выбрать людей, согласно их возрасту?

Собсно, как оказалось, всё почти так.

        today = date.today()
date_start = date(today.year - age_max - 1, today.month, today.day) + timedelta(days=1)
date_end = date(today.year - age_min, today.month, today.day)

humans_list = Human.objects.filter(
birth_date__gt = date_start,
birth_date__lte = date_end,
)



Отредактировано (Апрель 27, 2010 18:08:06)

Офлайн

  • Начало
  • » Django
  • » Как выбрать людей, согласно их возрасту?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version