Django ORM 查询重复记录并显示
写了简单的项目信息录入系统,让同事便于录入。
同事要求 根据指定1-3个字段查询数据是否有重复,并将重复的记录信息显示出来。
先写后台
废话不谈,两横一竖开始
时间长有没有写了,先复习一下 HTTP的request:
def review_http(request):
data01 = request.method # 请求中使用的HTTP方法的字符串表示,全部大写表示。
data02 = request.GET # 包含所有HTTP,GET参数的类字典对象
data03 = request.POST # 包含所有HTTP,POST参数的类字典对象
data04 = request.path # 返回用户访问的路径
data05 = request.get_full_path() # 获取当前请求路径并包含查询参数
data06 = request.body # 请求体,byte类型,request.POST的数据就是从body里面提取的
data07 = request.META # 所有请求头信息,字典类型数据,所有请求头的键都加上了一个HTTP_键名称
print(data07)
return HttpResponse('OK')
开始正题
def check_repeat(request):
# 分组查询
# 获取数据记录的总数
record_total = Tab1.objects.all().count()
# 通过去重获取剔除重复的记录总数
distinct_total = Tab1.objects.all().values('jd').distinct().count()
# # 单个字段的测试===================
# # 通过分组获取重复的井段
# repeat_data = Tab1.objects.all().values('jd').annotate(a=Count('jd')).filter(a__gt=1).values('jd')
# # 获取重复井段的总数
# repeat_total = repeat_data.count()
# # 通过列表推导式将重复的井段转为列表
# repeat_data_list = [i['jd'] for i in repeat_data]
# # 根据重复井段的list获取有重复井段的记录信息
# repeat_objs = Tab1.objects.filter(jd__in=repeat_data_list).values()
# # 两个字段的测试===================
# # 获取数据记录的总数
# record_total = Tab1.objects.all().count()
# # 通过去重获取剔除重复的记录总数
# distinct_total = Tab1.objects.all().values('jd').distinct().count()
# # 通过分组获取重复的井段
# repeat_data = Tab1.objects.all().values('jd', 'cdm').annotate(a=Count('jd') and Count('cdm')).filter(a__gt=1).values('jd')
# # 获取重复井段和长度的总数
# repeat_total = repeat_data.count()
# # 通过列表推导式将重复的井段和长度转为列表
# repeat_data_list = [i['jd'] for i in repeat_data]
# # 根据重复井段的list获取有重复井段的记录信息
# repeat_objs = Tab1.objects.filter(jd__in=repeat_data_list).values()
# print('记录总数:%d,剔除井段重复后总数:%d,有重复的记录数:%d' % (record_total, distinct_total, repeat_total))
# str_list = ['jd', 'cdm']
str_list = ['xmmc', 'jd', 'cmd']
if len(str_list) == 3:
repeat_data = Tab1.objects.all().values('xmmc', 'jd', 'cdm').annotate(
a=(Count('jd') and Count('cdm') and Count('xmmc'))).filter(a__gt=1).values('jd')
elif len(str_list) == 2:
if 'cdm' in str_list:
# 通过分组获取重复的井段
repeat_data = Tab1.objects.all().values('jd', 'cdm').annotate(a=(Count('jd') and Count('cdm'))).filter(
a__gt=1).values('jd')
else:
repeat_data = Tab1.objects.all().values('jd', 'xmmc').annotate(a=(Count('jd') and Count('xmmc'))).filter(
a__gt=1).values('jd')
else:
# 通过分组获取重复的井段
repeat_data = Tab1.objects.all().values('jd').annotate(a=Count('jd')).filter(a__gt=1).values('jd')
# 获取重复井段的总数
repeat_total = repeat_data.count()
# 通过列表推导式将重复的井段转为列表
repeat_data_list = [i['jd'] for i in repeat_data]
# 根据重复井段的list获取有重复井段的记录信息
repeat_objs = Tab1.objects.filter(jd__in=repeat_data_list).values()
print('记录总数:%d,剔除井段重复后总数:%d,有重复的记录数:%d' % (record_total, distinct_total, repeat_total))
return HttpResponse('OK')
后端写完了,下午写前端。。。。。。
我是业余小白,望大神提宝贵意见,谢谢~!
下午继续vue
<template>
<div>
<!-- 面包屑导航区域 -->
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>项目管理</el-breadcrumb-item>
<el-breadcrumb-item>数据检查</el-breadcrumb-item>
</el-breadcrumb>
<!-- 卡片视图区域 -->
<el-card>
<el-row>
<el-col :span="8">
<el-checkbox-group v-model="checkboxGroup" @change="handleCheckboxGroupChange">
<el-checkbox v-for="(value, key) in fields" :label="key" :key="value">{{value}}</el-checkbox>
</el-checkbox-group>
</el-col>
<el-col :span="4">
<el-button type="primary" :disabled="(this.checkboxGroup.includes('jd'))?false:true" @click="checkRepeat()">检查重复</el-button>
</el-col>
</el-row>
</el-card>
<!-- 表格 -->
<el-table :data="pageRepeatData" height="600" border show-summary style="width: 100%" size="mini">
<el-table-column type="selection"></el-table-column>
<el-table-column fixed prop="id" label="ID号" width="80">
</el-table-column>
<el-table-column fixed prop="xmmc" label="项目名称" width="290">
</el-table-column>
<el-table-column fixed prop="jd" label="井段" width="290">
</el-table-column>
<el-table-column fixed prop="cdm" label="长度/m" width="80">
</el-table-column>
<el-table-column prop="zgks" label="总管孔数" width="180">
</el-table-column>
<el-table-column prop="zgkgl" label="总管孔公里" width="200">
</el-table-column>
<el-table-column prop="gczt" label="工程状态" width="100">
</el-table-column>
</el-table>
<!-- 分页 -->
<el-row style="margin-top: 15px;">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentpage" :page-sizes="[25, 50, 100, 200]" :page-size="pagesize" layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
<el-col :span="16" style="text-align: right;">
</el-col>
</el-row>
</div>
</template>
<script>
const fieldOptions = { xmmc: '项目名称', jd: '井段', cdm: '长度' }
export default {
data () {
return {
checkboxGroup: ['jd'],
fields: fieldOptions,
currentUser: [], // 当前用户信息数据集
repeatData: [], // 所有的项目信息
pageRepeatData: [], // 分页后当前页的项目
selectProjects: [], // 选择复选框后,被选择的记录集合
// ===== 分页相关的变量 =====
total: 0, // 数据的总行数
currentpage: 1, // 当前所在的页
pagesize: 10 // 每页显示多少行
}
},
created () {
methods: {
async checkRepeat () {
const { data: res } = await this.$http.get('params/', { params: this.checkboxGroup })
if (res.code !== 1) {
return this.$message.error(res.data.msg)
}
// 把数据给project
this.repeatData = res.data
// 获取返回记录的总行数
this.total = res.data.length
// 获取当前页的数据
this.getPageInfo()
this.$message.success('重复数据获取成功')
},
handleCheckboxGroupChange (value) {
this.checkedValue = value
},
getPageInfo () {
// 清空变量pageProject中的数据
this.pageRepeatData = []
// 获得当前页的数据
for (let i = (this.currentpage - 1) * this.pagesize; i < this.total; i++) {
// 遍历数据添加到pageProject中
this.pageRepeatData.push(this.repeatData[i])
// 判断是否达到一页的要求
if (this.pageRepeatData.length === this.pagesize) { break }
}
},
// 分页时修改每页的行数
handleSizeChange (size) {
// 修改当前页每页数据行数
this.pagesize = size
// 当前页数据重新加载
this.getPageInfo()
},
// 调整当前的页码
handleCurrentChange (pageNumber) {
// 修改当前的页码
this.currentpage = pageNumber
// 当前页数据重新加载
this.getPageInfo()
}
}
}
</script>
<style lang='less' scoped>
</style>
完工上传正常运行~!