我对Django1.6项目有意见。你知道吗
我有一个报告一堆网络日志的视图。加载视图时,它会从数据库中获取所有日志。但是,用户可以访问两个日期选择器来限制查询的起始日期和截止日期。为此,我在get\u queryset()中添加了一个检查,以验证是否使用了这些日期选择器。这感觉真的很愚蠢和笨拙,我相信有一个更好的方法,但我不知道它是什么。这是我的视图代码,请告诉我这里是否缺少任何内容。你知道吗
class SiteUsersView(generic.ListView):
"""
EX: localhost/reports/site/facebook
"""
model = Cleanedlog
template_name = "trafficreport/site_chunk_log.html"
def get_context_data(self, **kwargs):
context = super(SiteUsersView, self).get_context_data(**kwargs)
context["url_chunk"] = self.kwargs["url_chunk"]
return context
def get_queryset(self):
from_date = self.request.GET.get("fromDate")
to_date = self.request.GET.get("toDate")
if from_date is not None and to_date is not None:
return self.from_to_date()
elif from_date is not None and to_date is None:
return self.from_date()
elif to_date is not None and to_date is None:
return self.to_date()
else:
return self.all_dates()
def from_date(self, from_date):
return Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"],
time_received__gte=from_date).values('user__name').annotate(
count=Sum('size')).order_by('-count')
def to_date(self, to_date):
return Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"],
time_received__lte=to_date).values('user__name').annotate(
count=Sum('size')).order_by('-count')
def from_to_date(self, to_date, from_date):
return Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"],
time_received__gte=from_date,
time_received__lte=to_date).values('user__name').annotate(
count=Sum('size')).order_by('-count')
def all_dates(self):
return Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"]).values('user__name').annotate(
count=Sum('size')).order_by('-count')
更重要的是,我有其他报告(用户/IP)遵循完全相同的格式,只是使用不同的模型和略有不同的查询。datepickers和所有的数据表示都在一个更高级别的模板中,这很好地工作,但是仅仅复制所有这些代码感觉非常愚蠢。我是不是漏掉了什么明显的东西?你知道吗
谢谢!你知道吗
我以前通过反转逻辑和使用
exclude
解决过类似的问题,例如:然后取值,根据需要进行注释和计数。你知道吗
与
None
的比较总是失败的,因此除非提供日期,否则不会排除任何内容。你知道吗这可能是最简单的编写方法,但您也可以利用链接查询集的功能,而无需对其进行评估:
这完全避免了将不必要的
None
比较放入查询中。你知道吗相关问题 更多 >
编程相关推荐