Vue前端与Django后端实现时间段数据筛选查询
本文介绍如何在Vue前端与Django后端之间实现指定时间段的数据查询功能。通过定义models、serializers及ViewSet接口,后端接收起止日期参数并执行过滤;前端利用Element UI的日期选择器获取时间范围,经合法性校验后调用API获取并展示结果。
前言
在开发过程中,经常需要实现数据筛选功能,例如仅查询特定时间段内的数据,而非获取全部数据。
实现这一功能的关键在于前端向后端发送包含起止时间的参数,由后端完成相应的查询处理。
本文将以Django后端配合Vue前端的简单示例,记录该功能的大致实现流程。
后端数据库
此处展示基础数据结构,核心字段为date,后续将依据该日期字段对返回前端的数据进行筛选。

models.py
class CountDownSign(models.Model):
name = models.CharField(max_length=1000)
date = models.DateField()
sign = models.CharField(max_length=200)
serializers.py
此处引入了DRF框架,但筛选查询的核心思路与具体框架无关。
class CountDownModelSerializer(serializers.ModelSerializer):
class Meta:
model = CountDownSign
fields = '__all__'
def create(self, validated_data):
return CountDownSign.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.date = validated_data.get('date', instance.date)
instance.sign = validated_data.get('sign', instance.sign)
instance.save()
return instance
views.py
用于提供筛选查询接口,接收前端传递的起止日期。核心代码逻辑如下。
obj = models.CountDownSign.objects.filter(date__range=(start, end))
class CountDownViewSet(ModelViewSet):
parser_classes = [JSONParser, FormParser]
"""视图集"""
queryset = models.CountDownSign.objects.all()
serializer_class = CountDownModelSerializer
# 搜索
search_fields = ('id', 'name', 'sign', 'date')
@action(methods=['post'], detail=False)
def getSE(self, request, *args, **kwargs):
start = request.data.get('start', None)
end = request.data.get('end', None)
if start and end:
obj = models.CountDownSign.objects.filter(date__range=(start, end))
if obj:
ser = CountDownModelSerializer(instance=obj, many=True)
print(ser.data)
return JsonResponse({
'code': '200',
'msg': '获取数据成功',
'data': ser.data
})
else:
return JsonResponse({
'code': '1002',
'msg': '获取失败',
})
else:
return Response(status=status.HTTP_204_NO_CONTENT)
前端界面
此处简要展示用于接收起止时间的两个日期选择器组件,并为其绑定搜索事件。
<div class="datePicker">
<div class="block" style="float: left">
<el-date-picker
v-model="value1"
type="datetime"
value-format="yyyy-MM-dd"
placeholder="请选择选择开始日期">
</el-date-picker>
</div>
<div class="block" style="float: left; margin-left: 20px;">
<el-date-picker
v-model="value2"
type="datetime"
value-format="yyyy-MM-dd"
placeholder="请选择截止日期">
</el-date-picker>
</div>
<el-button round style="float: left; margin-left: 20px;" @click="searchC">搜索</el-button>
</div>
data.js
实现对应的接口调用函数。
export function searchCountDown(start, end) {
return request({
url: 'countDown/getSE/',
method: 'post',
data: {
start: start,
end: end
}
})
}
点击事件的具体实现逻辑。
对输入的时间合法性进行判断,接收返回数据并进行绑定展示。
searchC() {
console.log(this.value1);
console.log(this.value2);
if (this.value1 < this.value2) {
searchCountDown(this.value1, this.value2).then(res => {
console.log(res.data);
this.searchRes = res.data;
})
} else {
this.$message.error("时间范围出错");
}
},
数据展示部分。
<div class="article">
<ul>
<li v-for="(item,index) in searchRes">
<div class="ui grid" style="width: 100%;height: 60px;">
<div class="four wide column"><span>{{ item.name }}</span></div>
<div class="four wide column"><span>{{ item.date }}</span></div>
<div class="four wide column"><span>{{ item.sign }}</span></div>
<div class="four wide column">
<el-button type="danger" icon="el-icon-delete" circle @click="deleteC(item.id)"></el-button>
<el-button type="primary" icon="el-icon-edit" circle></el-button>
</div>
</div>
<div class="ui divider"></div>
</li>
</ul>
运行结果展示。
从返回结果可见,数据均处于指定的时间范围内。需要注意的是,示例中2月25日零时返回的数据实际对应2月5日,这是由于数据格式化处理导致的时间范围边界表现。

总结
至此,关于Vue前端与Django后端如何查询一定时间段内数据的介绍已完成,更多相关vue和Django查询数据内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









