Django ORM 查询重复记录并显示

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>

完工上传正常运行~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值