在開發程序中經常會遇到篩選查詢之類的功能,比如查詢某一個時間段內的資料而非所有資料,
這樣我們就需要向后端發送時間段的引數,然后在后端處理查詢,
這里以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)
前端界面
這里簡略給出用于接收起止時間的兩個date-picker,并且給搜索系結事件,
<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號,因為進行了資料格式化,所以25號的資料也被回傳了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264196.html
標籤:其他
