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

浙公网安备 33010602011771号