python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Django 单字段区间查询

Django项目单字段区间查询的实现

作者:LoisMay

在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据,你可以像在SQL中那样使用SELECT语句来查找指定字段,本文就来介绍两种方法,感兴趣的可以了解一下

在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据,而且是对但字段查询这个时候我们有两两种方法解决

单字段类型是DateTimeField的

查询日期范围的 这个时候在filter.py里面重写DateTimeFromToRangeFilter,为什么要重写呢?
因为我们做区间查询 起始与结束时间两个日期当天的数据也需要的,如果不重写的话起止两天当天的数据是没有的,它的查询规则是<=没有>=这个时候我们就需要去重写,在获得结束日期的时候给它加一天日期即可达到效果>=

注意重写这个方法URL必须按照规定前缀后缀是 _after 和 _before

http://192.168.31.14:8000/gt_computer/?create_time_after=2023-09-13&create_time_before=2023-09-13

filters.py

	class CustomDateTimeFromToRangeFilter(filters.DateTimeFromToRangeFilter):
	    def filter(self, qs, value):
	        if value and value.stop:
	            new_value = slice(value.start, value.stop + timedelta(days=1))
	            return super().filter(qs, new_value)
	        return super().filter(qs, value)
	
	
	class ComputerFileter(filters.FilterSet):
	    create_time = CustomDateTimeFromToRangeFilter()
	
	    class Meta:
	        model = ComputerStatusRecord
	        fields = '__all__'

serializers.py

	class ComputerSerializer(ModelSerializer):
	    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)	
	    # 注意重写之后需要添加read_only要不然models.py里面的设置的属性没用了
	
	    class Meta:
	        model = ComputerStatusRecord
	        fields = "__all__"

方法二

上面的方法单指的是时间字段,方法二可以指认到数字及时间都可以匹配,就是当我们get请求进来都会走到get_queryset,这个时候我们可以重写它返回指定的内容做区间查询即可。

这个时候我们就不需要指定固定前后缀都可以使用

views.py

    def get_queryset(self):
        queryset = super().get_queryset()
        filters = {}
        for field_name in ['sum_number', 'over_kill_number', 'miss_number',		# 需要区间查询的字段
                           'over_kill_rate', 'miss_rate']:
            after = self.request.query_params.get(f'{field_name}_after')	# 可以根据自己的需求而定
            before = self.request.query_params.get(f'{field_name}_before')

            if after and before:
                filters[f'{field_name}__gte'] = after		
                filters[f'{field_name}__lte'] = before

        if filters:
            queryset = queryset.filter(**filters)	# 区间查询

        return queryset

到此这篇关于Django项目单字段区间查询的实现的文章就介绍到这了,更多相关Django 单字段区间查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文