如何处理Django查询中的更改日期

时间:2014-07-28 21:44:00

标签: python django django-views

我遇到了Django 1.6项目的问题。

我有一个报告大量网络日志的视图。加载视图后,它将从DB获取所有日志。但是,用户可以访问两个日期选择器来限制查询中的from_date和to_date。为了实现这一点,我在get_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和所有数据显示都在更高级别的模板中,并且效果很好,但是复制所有这些代码真的很愚蠢。我错过了一些明显的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我过去通过反转逻辑并使用{​​{1}}来解决这样的问题,例如:

exclude

然后取值并注释并根据需要进行计数。

return Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"]) \ .exclude(time_received__lt=from_date).exclude(time_received__gt=to_date) 的比较总是失败,因此除非提供日期,否则不会排除任何内容。

这可能是编写它的最简单方法,但您也可以利用链接查询集的能力,而无需对其进行评估:

None

这样就可以避免将不必要的base_qs = Cleanedlog.objects.filter(dest_url__contains=self.kwargs["url_chunk"]) if from_date is not None: base_qs = base_qs.filter(time_received_gte=from_date) if to_date is not None: base_qs = base_qs.filter(time_received_lte=to_date) return base_qs.values(# as above 比较放入查询中。