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

2024-03-29 04:57:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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和所有的数据表示都在一个更高级别的模板中,这很好地工作,但是仅仅复制所有这些代码感觉非常愚蠢。我是不是漏掉了什么明显的东西?你知道吗

谢谢!你知道吗


Tags: tonamefromselfnoneurlgetdate
1条回答
网友
1楼 · 发布于 2024-03-29 04:57:17

我以前通过反转逻辑和使用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

这完全避免了将不必要的None比较放入查询中。你知道吗

相关问题 更多 >