Skip to content

把操作django数据库的导入更新操作汇总一下以备参考

之前利用爬虫更新表内数据和用时间计算表数据的日更操作脚本

python
import os,sys,django
import asyncio,datetime,calendar
import httpx,json,time,math
from dateutil.relativedelta import relativedelta
from django.db.models import Q
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'shuai4.settings'
django.setup()
from cuifei.models import 催费表22年类,可收表19年,可收表20年,催费表类
from shuju.models import 数据通知表类

def 取结果(r):
    if r['obj']:
        j = []
        for i in r['obj']:
            j.append(i['fwqx'])
        return max(j),r['obj'][0]['jbrdh']
    else:
        return None,None
headers = {
    'Content-Type': 'application/json',
    'Authorization': '***',
}

url_by_税号 = '***'
查税号URL= '***'

文本 = []
# print(催费表22年类.objects.all()[:5])
queryset = 催费表22年类.objects.all()
def 更新到期日和时间(queryset):
    async def(client,body):
        def 保存结果(结果,body):
            if 结果[0]:
                body.到期日 = 结果[0]
                # body.经办人电话 = 结果[1]
                body.save(update_fields=['到期日'])

        r = await client.post(url_by_税号,headers=headers, data=json.dumps({'khsbh': body.税号,}),timeout=None)
        结果 = 取结果(r.json())
        if 结果[0]:
            保存结果(结果,body)
        else:
            用名称查的data = json.dumps({'count':100,'keyword': body.公司名称,'page':0})
            r = await client.post(查税号URL,headers=headers, data=用名称查的data,timeout=None)
            res_dict = r.json()
            if res_dict['obj']:
                税号1 = res_dict['obj'][-1]['khsbh']
                r1 = await client.post(url_by_税号,headers=headers, data=json.dumps({'khsbh': 税号1,}),timeout=None)
                结果1 = 取结果(r1.json())
                保存结果(结果1,body)
            else:
                return None,None

    async def():
        async with httpx.AsyncClient() as client:
            task_list = []
            for i in queryset:
                req = 爬(client,i)
                task = asyncio.create_task(req)
                task_list.append(task)
            await asyncio.gather(*task_list)
    start = time.time()
    asyncio.run(跑())
    end = time.time()
    print(end-start)
    print('查日期完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    # global b
    # b = '查日期完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'用时'+str(end-start)+'秒'
    文本.append('查日期完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+'用时'+str(end-start)+'秒')

def 更新可收年份(queryset):
    for i in queryset:
            if i.到期日:
                if type(i.到期日) == type('s'):
                    到期日 = datetime.datetime.strptime(i.到期日,'%Y-%m-%d').date()
                else:
                    到期日 = i.到期日
                # print(i.公司名称,i.税号)
                a = 可收表19年.objects.filter(公司名称__exact = i.公司名称).count()
                if a > 0:
                    i.可收19 = 1
                else:
                    i.可收19 = 0
                b = 可收表20年.objects.filter(Q(公司名称__exact = i.公司名称)|Q(税号__exact = i.税号)).count()
                if b > 0:
                    i.可收20 = 1
                else:
                    i.可收20 = 0
                c = 催费表类.objects.filter(Q(公司名称__exact = i.公司名称)|Q(税号__exact = i.税号)).count()
                if c > 0:
                    i.可收21 = 1
                else:
                    i.可收21 = 0
                # print(i.到期日)
                # print(datetime.date.today())
= datetime.datetime.now().year
= datetime.datetime.now().month
                下一个月 = (datetime.datetime.now()+relativedelta(months=1)).month
                # 日 = datetime.datetime.now().day
                新日 = calendar.monthrange(年,下一个月)[1]
                # print(新日)
                # print(datetime.date(年,月,新日)==i.到期日)
                if datetime.date(年,下一个月,新日)==到期日:
                    差年= 1
                else:
                    差年 = math.ceil((datetime.date(年,下一个月,新日)-到期日)/datetime.timedelta(days=365))
                # print(差年)
                到期日年份 = 到期日.year
                可收字典 = {2015:1,2016:1,2017:1,2018:1,2019:i.可收19,2020:i.可收20,2021:i.可收21,2022:1}
                # 年份 = sum(listn[:差年])
                j = 0
                for i1 in range(到期日年份,到期日年份+差年):
                    # print(i1)
                    j += 可收字典[i1]
                # print(j)
                i.几年 = j
                i.save(update_fields=['可收19','可收20','可收21','几年'])
    print('查可收几年完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    # global d
    # d = ('\n'+'查可收几年完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    文本.append('查可收几年完成于'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
更新到期日和时间(queryset)
更新可收年份(queryset)
def 发送邮件(邮件标题,称呼,邮件文字,发件人邮箱,密码,收件人邮箱,附件路径列表,附件命名列表):
    msg = MIMEMultipart()
    msg["Subject"] = 邮件标题
    msg["From"]    = 发件人邮箱  
    msg["To"]      = 称呼
    #这是文字部分
    part = MIMEText(邮件文字)
    msg.attach(part)
    #这是附件部分
    for 附件路径,附件命名 in zip(附件路径列表,附件命名列表):
        part = MIMEApplication(open(附件路径,'rb').read())
        part.add_header('Content-Disposition', 'attachment', filename=附件命名)
        msg.attach(part)

    s = smtplib.SMTP("smtp.qq.com", timeout=60)#SMTP服务的网址
    try:
        s.login(发件人邮箱, 密码)
        s.sendmail(发件人邮箱, 收件人邮箱, msg.as_string())#收件人邮箱可以是列表
        s.close()
        print("发送成功")
    except:
        print("发送失败")

def 拿昨天的老数据(区域):
    # 今天 = datetime.date.today()
    昨天 = datetime.date.today() - datetime.timedelta(days=1)
    # print(昨天)
    # print(type(昨天))
    a = 数据通知表类.objects.filter(Q(日期 = 昨天)&Q(区域=区域)).values()[0]
    # for i in a:
    #     print(i)
    return a


def 获得今天的新数据并存数据库(区域):
    # 崂山
    今天 = datetime.date.today()
    能查到日期的户数 = 催费表22年类.objects.filter(Q(到期日__isnull=False)&Q(区域=区域)).count()
    查不到日期的户数 = 催费表22年类.objects.filter(Q(到期日__isnull=True)&Q(区域=区域)).count()
= datetime.datetime.now().year
= datetime.datetime.now().month
= calendar.monthrange(年,月)[1]
    下一个月 = (datetime.datetime.now()+relativedelta(months=1)).month
    下一个月日 = calendar.monthrange(年,下一个月)[1]
    到期日为当月的户数 = 催费表22年类.objects.filter(Q(到期日__range=(datetime.date(年, 月, 1),datetime.date(年, 月, 日)))&Q(区域=区域)).count()
    到期日为下月的户数 = 催费表22年类.objects.filter(Q(到期日__range=(datetime.date(年, 下一个月, 1),datetime.date(年, 下一个月,下一个月日)))&Q(区域=区域)).count()
    前一个月 = (datetime.datetime.now()-relativedelta(months=1)).month
    新日 = calendar.monthrange(年,前一个月)[1]
    今年已逾期的户数 = 催费表22年类.objects.filter(Q(到期日__range=(datetime.date(年, 1, 1),datetime.date(年, 前一个月, 新日)))&Q(区域=区域)).count()
    下两个月 = (datetime.datetime.now()+relativedelta(months=2)).month
    今年还未到期的户数 = 催费表22年类.objects.filter(Q(到期日__range=(datetime.date(年,下两个月, 1),datetime.date(年, 12, 31)))&Q(区域=区域)).count()
    往年到期户 = 催费表22年类.objects.filter(Q(到期日__lt=datetime.date(年,1,1))&Q(区域=区域)).count()
    # &Q(几年__gte=1)
    更新数据 = {
        '日期':今天,
        '区域':区域,
        '能查到日期的户数':能查到日期的户数,
        '查不到日期的户数':查不到日期的户数,
        '到期日为当月的户数':到期日为当月的户数,
        '到期日为下月的户数':到期日为下月的户数,
        '今年已逾期的户数':今年已逾期的户数,
        '今年还未到期的户数':今年还未到期的户数,
        '往年到期户':往年到期户
    }
    #存数据
    数据通知表类.objects.update_or_create(defaults=更新数据,日期=今天,区域=区域)
    a = 数据通知表类.objects.filter(Q(日期 = 今天)&Q(区域=区域)).values()[0]
    # print(a)
    return a

崂山新数据字典 = 获得今天的新数据并存数据库('崂山')
市南新数据字典 = 获得今天的新数据并存数据库('市南')
市北新数据字典 = 获得今天的新数据并存数据库('市北')
李沧新数据字典 = 获得今天的新数据并存数据库('李沧')

崂山老数据字典 = 拿昨天的老数据('崂山')
市南老数据字典 = 拿昨天的老数据('市南')
市北老数据字典 = 拿昨天的老数据('市北')
李沧老数据字典 = 拿昨天的老数据('李沧')

def 增加数据(区域,新数据字典,老数据字典):
    文本.append(区域)
    文本.append('能查到日期的户数:'+str(新数据字典['能查到日期的户数'])+'户  '+str(新数据字典['能查到日期的户数']-老数据字典['能查到日期的户数']))
    文本.append('查不到日期的户数:'+str(新数据字典['查不到日期的户数'])+'户  '+str(新数据字典['查不到日期的户数']-老数据字典['查不到日期的户数']))
    文本.append('到期日为当月的户数:'+str(新数据字典['到期日为当月的户数'])+'户  '+str(新数据字典['到期日为当月的户数']-老数据字典['到期日为当月的户数']))
    文本.append('到期日为下月的户数:'+str(新数据字典['到期日为下月的户数'])+'户  '+str(新数据字典['到期日为下月的户数']-老数据字典['到期日为下月的户数']))
    文本.append('今年已逾期的户数:'+str(新数据字典['今年已逾期的户数'])+'户  '+str(新数据字典['今年已逾期的户数']-老数据字典['今年已逾期的户数']))
    文本.append('今年还未到期的户数:'+str(新数据字典['今年还未到期的户数'])+'户  '+str(新数据字典['今年还未到期的户数']-老数据字典['今年还未到期的户数']))
    文本.append('往年到期户:'+str(新数据字典['往年到期户'])+'户  '+str(新数据字典['往年到期户']-老数据字典['往年到期户']))
    # 文本.append('往年到期户茫茫多')
增加数据('崂山',崂山新数据字典,崂山老数据字典)
增加数据('市南',市南新数据字典,市南老数据字典)
增加数据('市北',市北新数据字典,市北老数据字典)
增加数据('李沧',李沧新数据字典,李沧老数据字典)

c = ''
for i in 文本:
    print(i)
    c += ('\n'+i)
print(c)
发送邮件('更新通知','崂山',c,'**','**',['**','**'],'','')

删除数据的脚本

python
import pandas as pd
import os,sys,django
import xlrd

class 打开excel文件():
    def __init__(self,文件名,第几个表):
        self.文件 = xlrd.open_workbook(filename = 文件名)
        self.表 = self.文件.sheet_by_index(第几个表-1)


    def 获得横向资料(self):
        self.数据 = [self.表.row_values(i) for i in range(self.表.nrows)]
        return self.数据


    def 获得纵向资料(self):
        self.数据 =  [self.表.col_values(i) for i in range(self.表.ncols)]
        return self.数据

    def 获得名称列数据(self,名称):
        def 获得列序号(表名,查找字段名):
            列序号 = None
            for i in range(表名.ncols):
                if (表名.cell_value(0,i) == 查找字段名):
                    列序号 = i
                    break
            return 列序号
        print(获得列序号(self.表,名称))
        self.数据 = self.表.col_values(获得列序号(self.表,名称),1)
        return self.数据
文件 = 打开excel文件('市南可收费注销.xls',1)
list1 = 文件.获得名称列数据('单位名称')

project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'shuai4.settings'
django.setup()
from cuifei.models import 催费表类

催费表类.objects.filter(公司名称__in=list1).delete()

填充数据的脚本

python
import pandas as pd
import os,sys,django


class 提取类():
    def __init__(self,文件名,第几个表):
        self.文件 = pd.read_excel(文件名, 第几个表)

    def 拿取数据(self,从第几行开始,*列名):
        self.数据 = self.文件.loc[从第几行开始-2:,[*列名,]]
        #print(self.数据)
        return self.数据

销售表 = 提取类('不可收名单.xls',0)
销售数据 = 销售表.拿取数据(2,'纳税人识别号','纳税人名称')
销售数据 = 销售数据.values.tolist()


project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'shuai4.settings'
django.setup()
from cuifei.models import 催费表22年类
# 催费表22年类.objects.all().update(是否可收='可收')
for i in 销售数据:
    if 催费表22年类.objects.filter(税号=i[0]):
        催费表22年类.objects.filter(税号=i[0]).update(是否可收='不可收')
        print(i[1]+',通过税号确定不可收')
    else:
        if 催费表22年类.objects.filter(公司名称=i[1]):
            催费表22年类.objects.filter(公司名称=i[1]).update(是否可收='不可收')
            print(i[1]+'通过名称确定不可收')
        else:
            print(i[1]+'发行表没有的不可收企业')

批量导入数据脚本

python
import pandas as pd
import os,sys,django

class 提取类():
    def __init__(self,文件名,第几个表):
        self.文件 = pd.read_excel(文件名, 第几个表)

    def 拿取数据(self,从第几行开始,*列名):
        self.数据 = self.文件.loc[从第几行开始-2:,[*列名,]]
        #print(self.数据)
        return self.数据

销售表 = 提取类('导入模板.xlsx',0)
销售数据 = 销售表.拿取数据(2,'公司名称','区域','税号','性质')
销售数据 = 销售数据.values.tolist()


project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'shuai4.settings'
django.setup()
from cuifei.models import 催费表类

list = []
for i in 销售数据:
    # print(i[4])
    list.append(催费表类(公司名称 = i[0],区域 = i[1],税号 = i[2],性质 = i[3]))


催费表类.objects.bulk_create(list)

更新某一列数据脚本

python
import pandas as pd
import os,sys,django


class 提取类():
    def __init__(self,文件名,第几个表):
        self.文件 = pd.read_excel(文件名, 第几个表)

    def 拿取数据(self,从第几行开始,*列名):
        self.数据 = self.文件.loc[从第几行开始-2:,[*列名,]]
        #print(self.数据)
        return self.数据

销售表 = 提取类('/www/wwwroot/shuai4-django-env3.7/shuai4-django/时间.xls',0)
销售数据 = 销售表.拿取数据(2,'税号','名称','服务期限')
销售数据 = 销售数据.values.tolist()


project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'shuai4.settings'
django.setup()
from cuifei.models import 催费表22年类

for i in 销售数据:
    if 催费表22年类.objects.filter(税号=i[0]):
        催费表22年类.objects.filter(税号=i[0]).update(到期日=i[2])
        print(i[0]+'成功')
    else:
        if 催费表22年类.objects.filter(公司名称=i[1]):
            催费表22年类.objects.filter(公司名称=i[1]).update(到期日=i[2])
            print(i[0]+'成功')
        else:
            print(i[0]+'失败')