根据参数简化QuerySet调用

时间:2012-08-14 05:00:21

标签: django coding-style

假设我有一个变量time_period,其值为以下字符串之一:weeklymonthlyyearly

...以及通过模型TimeModel进行QuerySet调用过滤:

time_period = 'monthly'
instance = TimeModel.objects.get(time_period=time_period,
                                 year=datetime.now().year,
                                 month=datetime.now().month)

在这种情况下,我已经传递参数yearmonth,因为time_period == 'monthly'。如果time_period == yearly,我希望只传递year,如果time_period == weekly,我会传递所有三个(yearlymonthly和{{1} in。

有没有办法做我刚才描述的3 weekly陈述?

1 个答案:

答案 0 :(得分:2)

也许这会有所帮助:

from django.db.models import Q

now = datetime.now()
time_periods = {
    'weekly': Q(year=now.year, month=now.month, day=now.week),  # note from OP: now.week is technically invalid; you actually want to use now.isocalendar()[1]
    'monthly': Q(year=now.year, month=now.month),
    'yearly': Q(year=now.year),
}

instance = TimeModel.objects.get(time_periods[time_period], time_period=time_period)