【发布时间】:2011-11-17 05:43:21
【问题描述】:
我对 Python 和 Django 都很陌生,并希望尽可能遵循最佳实践。我想整理以下代码,使其更易于使用。
我正在尝试设置一个可以通过多个 URL 访问的视图,这些 URL 提供了将返回和显示查询集的不同参数。
我设置了以下网址:
url(r'^myrecords/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'),
url(r'^myrecords/page(?P<page>[0-9]+)/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'),
url(r'^myrecords/(?P<year>\d{4})/$', login_required(RecordListView.as_view()), {'filter': 'year'}, name='myrecords'),
url(r'^myrecords/last(?P<months>[0-9]{1,2})months/$', login_required(RecordListView.as_view()), {'filter': 'month'}, name='myrecords'),
然后在我看来,我有这样的东西(实际上还有其他几个参数,但无论输入的 URL 是什么,这些参数都应该保持不变。):
def get_queryset(self):
if (self.kwargs['filter'] == 'month'):
x_months_ago = (datetime.date.today() -
datetime.timedelta(int(self.kwargs['months']) * 365 / 12))
queryset = Record.objects.filter(user=self.request.user,
date__gte = x_months_ago.isoformat())
elif (self.kwargs['filter'] == 'year'):
queryset = Record.objects.filter(user=self.request.user, date__year=self.kwargs['year'])
else
queryset = Record.objects.filter(user=self.request.user)
这对我来说似乎很混乱。无论如何我可以让它更清洁吗?是否可以将过滤器参数放在某种数据结构中,然后将它们传递给 Record.objects.filter 行,而不是多次写出整个内容?
任何建议将不胜感激。
谢谢。
【问题讨论】:
标签: python django views models