django orm 以及批量插入

Django中的项目settings.py 多数据库配置
代码如下:(需安装pip install django-db-connection-pool)
DATABASES中定义数组内容,列表中的每个元素都是这个db一个数据库

DATABASES = {
    "default": {
        'ENGINE': 'dj_db_conn_pool.backends.mysql',
        'NAME': 'day05db',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'root123',
        'HOST': '127.0.0.1',  # ip
        'PORT': 3306,
        'POOL_OPTIONS': {
            'POOL_SIZE': 10,  # 最小
            'MAX_OVERFLOW': 10,  # 在最小的基础上,还可以增加10个,即:最大20个。
            'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。
            'TIMEOUT': 30,  # 池中没有连接最多等待的时间。
        }
    },
    "bak": {
        'ENGINE': 'dj_db_conn_pool.backends.mysql',
        'NAME': 'day05bak',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'root123',
        'HOST': '127.0.0.1',  # ip
        'PORT': 3306,
        'POOL_OPTIONS': {
            'POOL_SIZE': 10,  # 最小
            'MAX_OVERFLOW': 10,  # 在最小的基础上,还可以增加10个,即:最大20个。
            'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。
            'TIMEOUT': 30,  # 池中没有连接最多等待的时间。
        }
    },
}

执行数据库迁移

python manage.py makemigrations    # 找到所有已注册的app中的models.py中的类读取 -> migrations配置

python manage.py migrate
python manage.py migrate --database=default #指定迁移的数据库
python manage.py migrate --database=bak

操作对应的数据库using,using中的值对应着setting中DATABASES列表中的元素值

class UserInfo(models.Model):
    title = models.CharField(verbose_name="标题", max_length=32)
models.UserInfo.objects.using("default").create(title="test")
models.UserInfo.objects.using("bak").all()

多数据库路由配置settings.py
DaemonRuuter 为路由类

DATABASE_ROUTES=["utils.router.DaemonRuuter"]
class DemoRouter(object):
    #如果是model的名字是userinfo用bak否则用default
    def db_for_read(self,model,**hint):
    	#if model._meta.model_name=="userinfo":
    		#return "bak"
         if model._meta.app_label=="app01":
	    	   return "default"
	      if model._meta.app_label=="app02":
	      		return "default"
    def db_for_write(self,model,**hint):
          if model._meta.app_label=="app02":
	    	   return "default"
	      if model._meta.app_label=="app01":
	      		return "default"

分库(单app)
在这里插入图片描述
表关系
一对多 外键在多多那里

from django.db import models
class Depart(models.Model):
	title = model.CharField(verbose_name="标腿",max_length=32,unique=True)
	class Meta:
		db_table="depart"
class UserInfo(models.Model):
	name =  model.CharField(verbose_name="名字",max_length=32,unique=True)
	dep = model.ForeignKey(to="Depart",on_delete=models.CASCADE)
	class Meta:
		db_table="userinfo"

多对多

from django.db import models
class Boy(models.Model):
	name =  model.CharField(verbose_name="名字",max_length=32,unique=True)
	class Meta:
		db_table="boy"
class Girl(models.Model):
	name =  model.CharField(verbose_name="名字",max_length=32,unique=True)
 
	class Meta:
		db_table="girl"
class B2G(models.Model):
	bid = model.ForeignKey(to="Boy",on_delete=models.CASCADE)
	gid = model.ForeignKey(to="Girl",on_delete=models.CASCADE)
	address = models.CharField(verbose_name="地点", max_length=32)

数据库操作

class Role(models.Model):
    title = models.CharField(verbose_name="标题", max_length=32)
obj = models.Role.objects.create(title="Admin")
print(obj.title)
查看
models.Role.objects.all()#查看所有
for obj in v1:
    print(obj, obj.id, obj.title, obj.od)
models.Role.objects.filter(id=1) 
models.Role.objects.filter(id__gt=1)查看id大于1的所有元素
models.Role.objects.filter(id__gte=1)查看id大于等于1的所有元素
v3 = models.Role.objects.filter(id__in=[11, 22, 33]) #在列表中的元素
v3 = models.Role.objects.filter(title__contains="户")#包含
print(v3.query)

v3 = models.Role.objects.filter(title__startswith="户")#以什么开始
print(v3.query)

v3 = models.Role.objects.filter(title__isnull=True)

# 不等于
v3 = models.Role.objects.exclude(id=99).filter(od=88)
print(v3.query)

# queryset=[{'id': 6, 'title': '客户'}, {'id': 7, 'title': '客户'}]
v4 = models.Role.objects.filter(id__gt=0).values("id", 'title')

# QuerySet = [(6, '客户'), (7, '客户')]
v5 = models.Role.objects.filter(id__gt=0).values_list("id", 'title')
print(v5[0])

v6 = models.Role.objects.filter(id__gt=0).first()
# print(v6)  # 对象

v7 = models.Role.objects.filter(id__gt=10).exists()
print(v7)  # True/False

# asc
v8 = models.Role.objects.filter(id__gt=0).order_by("id")

# id desc  od asc
v9 = models.Role.objects.filter(id__gt=0).order_by("-id", 'od')

一对多


class Depart(models.Model):
    """ 部门 """
    title = models.CharField(verbose_name="标题", max_length=32)


class Admin(models.Model):
    name = models.CharField(verbose_name="姓名", max_length=32)
    pwd = models.CharField(verbose_name="密码", max_length=32)

    depart = models.ForeignKey(verbose_name="部门", to="Depart", on_delete=models.CASCADE)
    
models.Admin.objects.create(name='xx1', pwd='123123123', depart_id=2)
# models.Admin.objects.create(**{..})

obj = models.Depart.objects.filter(id=2).first()
models.Admin.objects.create(name='xx2', pwd='123123123', depart=obj)# 可以传递对象,可以传递id
models.Admin.objects.create(name='xx2', pwd='123123123', depart_id=obj.id)

# 找到部门id=3的所有的员工,删除
# models.Admin.objects.filter(depart_id=3).delete()

# 删除销售部的所有员工
# obj = models.Depart.objects.filter(title="销售部").first()
# models.Admin.objects.filter(depart_id=obj.id).delete()

# models.Admin.objects.filter(depart__title="销售部", name='武沛齐').delete()

select_related提前链表查询避免多次查询

v2 = models.Admin.objects.filter(id__gt=0).select_related("depart")
for obj in v2:
    print(obj.name, obj.pwd, obj.id, obj.depart_id, obj.depart.title)

# 3. select id,name.. from admin inner join depart      queryset=[{},{}]
v3 = models.Admin.objects.filter(id__gt=0).values("id", 'name', 'pwd', "depart__title")
print(v3)

需要注意:需要将实例化的对象一个个追加到我的列表中,才能够通过bulk_create()批量追加

  l.append(models.Net(**dic))
class Net(APIView):
    print("welcom to net")
    def post(self,request,*args,**kwargs):
        data = request.body
        post = request.POST
        # data = data.decode("utf-8")
        data = json.loads(data)
        data = eval(data)
        print("网络data",data,type(data))
        # 主要是存放的网卡的名字,网卡的接受bytes,网卡的发送bytes,
        # 需要画出图来,最好是两个折线图
        server_name = data.pop("server_name")
        global server_obj
        if  not server_obj:
            server_obj = models.Server.objects.filter(name=server_name).first()
        print("net info is****", data, type(data))
        net_obj = serializers.NetSerializer(data=data)
        l = []

        dic = {}
        for k, v in data.items():
            dic["net_name"] = k
            dic["net_send"] = str(v[0])
            dic["net_recv"] = str(v[1])
            print(dic)
            net_obj = serializers.NetSerializer(data=dic)
            if net_obj.is_valid():
                print("net网络反序列化成功")
                dic["server"] = server_obj
                l.append(models.Net(**dic))
            # l.append(server_obj)
        # models.Net.objects.create(**data,server = server_obj)
        models.Net.objects.bulk_create(l)
        return HttpResponse("ok")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值