模型层知识点补充

事务操作

        ORM中的事物和MySQL的事物原理一样也有四大特征(ACID) 原子性、一致性、隔离性、持久性

\bullet  原子性:

        事务是一个完整的操作,当有任务完成了有的没完成时则整个操作失败必须都成功才能真正的完成两种情况:事务提交(commit)和事务回滚(rollback)

\bullet  一致性:

        事务按照预期的效果执行,数据达到预期的结果

\bullet  隔离性:

        事务的隔离性是当多个用户并发访问数据库时,数据库给每一个用户开启的事务都是独立的不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

\bullet  持久性:

        持久性的体现就是数据一旦提交之后,那么对于数据的改变就是永久的

# 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():创建多对多关系

\bullet  除了以上的常见自带字段,我们还可以自定义字段

# 举例自定义
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")

'''
优点:扩展性强并且支持正反向查询
缺点:无法使用多对多四个方法
'''

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值