ORM多表操作--增删改

外部文件引入django models进行数据操作

import os
# Create your tests here.
if __name__ == '__main__':
  #django 环境
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "图书管理系统.settings")
  import django
  django.setup()
  from app01 import models
  obj_lst = []
  for i in range(1,10):
      obj = models.public.objects.create(
            bookname= 'py%s'%i if i<5 else 's'%i,
            price = 20+i*20,
            public = '冬冬出版社' if i<5 else '婷婷出版社',
          datetime= '202%s-8-9'%i

      )
      obj_lst.append(obj)
  models.public.objects.bulk_create(obj_lst)

form表单问题

novalidate 告诉浏览器不需要帮我做校验,我自己做
form action 什么都不写 就是往原路径 返回

创建超级用户

python manage.py createsuperuser;

admin注册 models

admin.site.register(models.Book)

 

mysql严格模式

1.查看当前会话的模式
select @@sql_mode;
2. 查看全部模式
select @@global.sql_mode;
没有配置严格模式
mysql 配置文件配置以下

orm多表操作

一个表 常用信息和不常用 可以分开两张表
一对一 forign key + unique
一对多 foreign key
django1.11.9 默认做级联
django 2.2 版本以上 不默认级联le
做级联
foreign key 强制约束关系
on_delete = models.CASCADE
不做级联
on_delete = models.SET_NULL
forign key 指向那个表,那个表就是大腿,
大腿要跑不行,关联你的那个人很难受
关联你的那个人可以跑,你大腿还在这里

级联 三种情况

1.不做级联 
a表 外键 关联 b表   b表 不能删任何东西 会报错
2.做级联(级联更新,级联删除)
a表跟着b表一起修改数据,删除数据
3.做级联 on_delete = SET_NULL
b 表可以删,删完以后,a表关联你的foreign key 变成 NULL

一对一多表字段

to = '表名'  外键关联的表名
to_filed = 'id' 外键关联的字段
on_delete = models.CASCADE 级联删除
#一对一 表 作者表--> 作者详细信息表 外键建在那个表都可以
#作者表
class Author(models.Model):
  name = models.CharField(max_length=32)
  age = models.IntegerField()
  authorDetail = models.OneToOneField(to= 'AuthorDetail',to_field='id',
                                      on_delete=models.CASCADE)
#作者详细信息表
class AuthorDetail(models.Model):
  birthday = models.DateField()
  #写成字符串 方便查询
  # telephone = models.BigIntegerField()
  telephone = models.CharField(max_length=32)
  addr = models.CharField(max_length=64)

一对多,多对多表字段

#一对多  出版社 --> 书籍表  外键加在多的里边
class Publish(models.Model):
  name = models.CharField(max_length=32)
  city = models.CharField(max_length=32)
  #EmailFiled 其实就是CharField django提供的校验email格式 xx@xx的mysql中没有
  email = models.EmailField()

class Book(models.Model):

  title = models.CharField(max_length=32)
  publishDate = models.DateField()
  price = models.DecimalField(max_digits=5,decimal_places=2)
  publishs = models.ForeignKey(to='Publish')
  #authors(类属性)不会出现在Book表中,是django提供来找到和操作多对多第三张表的
  authors = models.ManyToManyField(to='Author')

一对一 添加记录

1.两个表都没记录
obj = models.AuthorDetail.objects.create(
      birthday='2017-9-8',
      telephone='138348500',
      addr = '山西太古'
  )
  models.Author.objects.create(
      name='销毁',
      age='22',
      authorDetail=obj
  )
方式二: 常用的
obj = models.AuthorDetail.objects.filter(addr='山西太谷').first()
  models.Author.objects.create(
      name='德刚',
      age = 33,
      authorDetail_id=obj.id
  )

一对多 添加记录

#一对多方式一
  obj = models.Publish.objects.get(id=1)
  models.Book.objects.create(
      title= '李帅的床头故事',
      publishDate='2017-08-09',
      price = 20.5,
      publishs= obj //属性 = 对象
  )
方式二 常用的
obj = models.Publish.objects.get(id=1)
  models.Book.objects.create(
      title= '李帅的床头故事2',
      publishDate='2017-08-09',
      price = 20.5,
      publishs_id= obj.id //mysql字段 = 对象的id属性
  )

多对多 添加记录

#多对多  常用
  obj = models.Book.objects.get(id=1)
  obj.authors.add(*[1,2])
   
  author1 = models.Author.objects.get(id=3)
  author2 = models.Author.objects.filter(id=2).first()
  book = models.Book.objects.get(id=2)
  book.authors.add(*[author1,author2])

一对一
被关联表数据的删除
models.AuthorDetail.objects.get(id=1).delete()
没被关联表数据的删除
models.Author.objects.get(id=2).delete()
一对多 跟一对一一样 delete()
多对多:
方式一 :
book = models.Book.objects.get(id=2) //6是Author id
book.authors.remove(6)
book.authors.remove(*[5,6])
方式二: 全部清空
book.authors.clear() 全部清空跟book有关系的作者
方式三: 清空加添加
book.authors.set('1')
book.authors.set(['5','6'])

更新 ,orm级联更新没有,只能级联删除

一对一 更新
方式一:
obj = models.AuthorDetail.objects.create(
birthday= '1987-9-12',
telephone='12836666',
addr= '北京海淀'
)
models.Author.objects.filter(pk=2).update(
name = '得港',
age = 22,
authorDetail_id = obj.id

)
方式二:
obj = models.AuthorDetail.objects.create(
birthday= '2020-6-6',
telephone='12836666',
addr= '北京海淀'
)
models.Author.objects.filter(pk=2).update(
name = '小宝贝',
age = 12,
authorDetail = obj


一对多 更新 pk 和id 相同
方式一:
obj = models.Book.objects.filter(pk =3).update(
price = 30.5,
publishs = 6 //6是外键表的id
)
方式二:
obj = models.Publish.objects.get(id = 4)
models.Book.objects.filter(pk =3).update(
price = 30.5,
publishs = obj
)
关键字段 属性 = 对象
mysql字段 = obj.id

posted @ 2021-04-15 11:03  苦行僧冬*婷  阅读(76)  评论(0)    收藏  举报