事务操作
ORM中的事物和MySQL的事物原理一样也有四大特征(ACID) 原子性、一致性、隔离性、持久性
原子性:
事务是一个完整的操作,当有任务完成了有的没完成时则整个操作失败必须都成功才能真正的完成两种情况:事务提交(commit)和事务回滚(rollback)
一致性:
事务按照预期的效果执行,数据达到预期的结果
隔离性:
事务的隔离性是当多个用户并发访问数据库时,数据库给每一个用户开启的事务都是独立的不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
持久性:
持久性的体现就是数据一旦提交之后,那么对于数据的改变就是永久的
# start transaction\rollback\commit\savepoint from django.db import transaction # 依然需要导入模块 try: with transaction.atomic(): pass # 多条ORM语句 except Exception as e: print(e)
模型层常见字段
AutoField():int自增列必须填入参数 primary_key=True
IntegerField():一个整数类型范围在 -2147483648-2147483647
ChatField():字符类型,必须提供max_length参数表示字符最大长度
DateField():日期字段 年月日
DateTimeField():日期时间字段 年月日时分秒
EmailField():存储邮件
BooleanField():传布尔值存数字0或1
TextField():存储大段文本
FileField():存储文件数据 自动找指定位置存储 字段存具体路径
ForeignKey():创建外键
OneToOneField():创建一对一关系
ManyToManyField():创建多对多关系
除了以上的常见自带字段,我们还可以自定义字段
# 举例自定义 class MyCharField(models.Field): def __init__(self, max_length, *args, **kwargs): self.max_length = max_length super().__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection): return 'char(%s)' % self.max_length info = MyCharField(max_length=32)
ORM常见字段参数
null:用于表示某个字段可以为空
unique:设置该字段在此表中必须是唯一的 unique = True
db_index:为此字段设置索引
default:为该字段设置默认值
max_length:字符串长度
auto_now_add:创建数据记录的时候会把当前时间添加到数据库
verboses_name:设置字段备注名
choices:可以提前设置好选项定义在类里
class UserInfo(models.Model): gender_choice = ( (1,'男性'), (2,'女性), ) gender = models.IntegerField(choices=gender_choice) # 取到的是对应的数字 userinfo_obj.get_gender_display()# 获取数字对应的真正的数据
to:设置要关联的表
to_field:设置要关联的表的字段
on_delete:当删除关联表中的数据时,当前表与其关联的行的行为
models.CASCADE: 删除关联数据,与之关联也删除 models.SET_NULL: 当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null, 这个字段必须可以允许为空 models.PROTECT: 当主表中的一行数据删除时,由于从表中相关字段是受保护的外键 所以不允许删除 models.SET_DEFAULT: 当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值, 这个字段应设置默认值 models.SET: 当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值 models.DO_NOTHING: 什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT, 这个约束与django中的models.PROTECT相似
多对多关系表三种创建方式
1.自动创建
authors = models.ManyToManyField(to='Author') ''' 优点:第三张表自动创建 缺点:第三张表扩展性差 '''
2.手动创建
class Book(models.Model): pass class Author(models.Model): pass class Book2Author(models.Model): book_id = models.ForeignKey(to="Book") author_id = models.ForeignKey(to="Author") ''' 优点:第三张表扩展性强 缺点:无法使用正反向查询以及多对多四个方法 '''
3.半自动创建
class Book(models.Model): authors = models.ManyToManyField(to='Author', through='Book2Author' through_fields=('book_id','author_id') ) class Author(models.Model): pass class Book2Author(models.Model): book_id = models.ForeignKey(to="Book") author_id = models.ForeignKey(to="Author") ''' 优点:扩展性强并且支持正反向查询 缺点:无法使用多对多四个方法 '''