如何计算 JOINed 模型中的用户数?
How to count users in JOINed models?
比方说,我们有两个模型:
class User(models.Model):
nickname = models.CharField(max_length=50)
email = models.CharField(max_length=50)
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
carma = models.BooleanField(default=False)
birthdate = models.DateField(input_formats=['%Y-%m-%d'])
如何获取用户数量:
1) 所有年龄在 18 岁以下的用户?
2) 18 - 25 岁之间的所有用户
3) 25 岁以上的所有用户
据我了解,我需要从出生日期获取年龄,例如这样:
def age(self):
import datetime
return int((datetime.date.today() - self.birthday).days / 365.25 )
并以某种方式在查询中使用返回的年龄。
如何在 Django 中使用内部函数(针对每个指定的查询)执行这些交叉请求?
谢谢!
from datetime import date
def add_years(d, years):
try:
return d.replace(year = d.year + years)
except ValueError:
return d + (date(d.year + years, 1, 1) - date(d.year, 1, 1))
today = datetime.date.today()
ago18 = add_years(today, -18)
ago25 = add_years(today, -25)
# < 18
User.objects.filter(profile__birthdate__gt=ago18)
# 18 <= and < 25
User.objects.filter(profile__birthdate__lte=ago18, profile__birthdate__gt=ago25)
# 25 <=
User.objects.filter(profile__birthdate__lte=ago25)
基于此answer。
比方说,我们有两个模型:
class User(models.Model):
nickname = models.CharField(max_length=50)
email = models.CharField(max_length=50)
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
carma = models.BooleanField(default=False)
birthdate = models.DateField(input_formats=['%Y-%m-%d'])
如何获取用户数量:
1) 所有年龄在 18 岁以下的用户?
2) 18 - 25 岁之间的所有用户
3) 25 岁以上的所有用户
据我了解,我需要从出生日期获取年龄,例如这样:
def age(self):
import datetime
return int((datetime.date.today() - self.birthday).days / 365.25 )
并以某种方式在查询中使用返回的年龄。
如何在 Django 中使用内部函数(针对每个指定的查询)执行这些交叉请求?
谢谢!
from datetime import date
def add_years(d, years):
try:
return d.replace(year = d.year + years)
except ValueError:
return d + (date(d.year + years, 1, 1) - date(d.year, 1, 1))
today = datetime.date.today()
ago18 = add_years(today, -18)
ago25 = add_years(today, -25)
# < 18
User.objects.filter(profile__birthdate__gt=ago18)
# 18 <= and < 25
User.objects.filter(profile__birthdate__lte=ago18, profile__birthdate__gt=ago25)
# 25 <=
User.objects.filter(profile__birthdate__lte=ago25)
基于此answer。