Django:如何将分隔的整数字段(年、月)连接为日期范围以过滤数据库

Posted

技术标签:

【中文标题】Django:如何将分隔的整数字段(年、月)连接为日期范围以过滤数据库【英文标题】:Django: how to concatenate the separated integer field (Year, month) as date range to filter the database 【发布时间】:2016-01-17 08:53:42 【问题描述】:

在表单中,有两个字段:

class Input(models.Model):
    start_year=models.CharField(max_length=100)
    start_month=models.CharField(max_length=100)
    end_year=models.CharField(max_length=100)
    end_month=models.CharField(max_length=100)
    ....

在 sql 数据库中,有两列: year ;月,....

我想根据用户在表单中输入的内容 (start_year,start_month ; end_year,end_month) 作为日期范围在数据库中进行过滤(年、月)。

XX.objects.filter(date_range=[]),或者我可以把这个data_range函数放进去吗?

如果需要,以下是一些相关代码。

用户输入数据的表单应用 - views.py

def input(request):
    if request.method == 'POST':
        form = InputForm(request.POST)
        if form.is_valid():
            ...
            start_year=form.cleaned_data['start_year']
            start_month=form.cleaned_data['start_month']
            end_year=form.cleaned_data['end_year']
            end_month=form.cleaned_data['end_month']
            ...
            form.save()
            return redirect('FilterResult')

根据用户输入过滤数据库 - views.py

class XXXView(ListView):
    context_object_name = 'XXX'
    template_name = 'XXX.html'

    queryset = XXX.objects.all()
    start_year=self.request.query_params.get('start_year', None)  /*get from the form what the user has entered
    start_month=self.request.query_params.get('start_month', None)
    end_year=self.request.query_params.get('end_year', None)
    end_month=self.request.query_params.get('end_month', None)

    objects.filter(date_range=[.....]) /*how to concatenate the year and month to put here?

    if start_year,start_month,end_year,end_month are not None:
                      queryset=queryset.filter(start_month=start_month,start_year=start_year,end_year=end_year,end_month=end_year)

    sales=XXX.objects.filter(queryset).aggregate(Sum('sales'))

    def get_context_data(self, **kwargs):
        context = super(XXXView, self).get_context_data(**kwargs)
        context['input'] = Input.objects.order_by('-id')[:1]
        return context

【问题讨论】:

如何检测开始和结束? @汉堡王,对不起,我不太明白你的意思,“开始”应该是 start_year&start_month,“end”应该是 end_year&end_month。 能否提供更多关于如何使用模型的说明? @汉堡王,您好,我已经上传了视图文件,谢谢。 【参考方案1】:

如果您使用 DateField 而不是 CharField(我认为您确实应该这样做,因为您正在处理日期),如下所示:

class Input(models.Model):
    # This date has the month and the year. You can set the default day 
    # to the 1st of every month for consistency.
    startDate=models.DateField() 

    # This also has the end month and end year.
    endDate=models.DateField() 

您可以通过以下方式按范围过滤日期对象:

Input.objects.filter(startDate__range=["2011-01-01", "2011-01-31"])

或者,如果您想按特定月份进行过滤,您可以这样做:

Input.objects.filter(endDate__year='2011', endDate__month='01')

查看此帖子:Django database query: How to filter objects by date range? 和此帖子:How do I subtract two dates in Django/Python? 了解更多信息。

我不太确定您到底想要完成什么,但我确信如果您使用 DateField 而不是 CharField 来保存日期,它会容易得多。我还建议您阅读有关 DateField 的文档以获取更多信息(它可以在您的情况下派上用场)。

【讨论】:

谢谢。但我认为我的情况有些不同。因为在 sql 数据库中,有 2 个单独的列:“年”、“月”。如果我输入 Input.objects.filter(startDate__range=["StartDate", "EndDate"]),它如何检查数据库中 2 个分开的年月行?

以上是关于Django:如何将分隔的整数字段(年、月)连接为日期范围以过滤数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 id 字段转换为普通整数字段?

具有浮点形式输入的 django 整数模型字段

如何将空值存储为整数字段

如何使用`django-filters`编写将在整数字段上使用范围过滤器的GraphQL查询?

如何在 Django 中创建自动递增整数字段?

oracle查询结果格式问题