Django ORM 知识概要

时间:2021-03-30 18:22:01
  1. 相关命令
    1. python3 manage.py makemigrations
      根据模型生成相关迁移文件
    2. python3 manage.py migrate
      根据迁移文件,将表结构更新到数据库中,并在Django中带的migrations数据表中更改数据库记录
  2. 字段
    1. 常用的字段
      1. 自增长字段
        1. models.AutoField()
        2. models.BigAutoField()
      2. 二进制数据
        1. models.BinaryField()
      3. 布尔型
        1. 允许为空 models.BooleanField()
        2. 不允许为空 models.NullBooleanField()
      4. 整型
        1. 5个字节的正整数models.PositiveSmallIntegerField()
        2. 6个字节的整数
          models.SmallIntegerField()
        3. 11个字节的整数
          models.IntegerField()
        4. 20个字节的整数
          models.BigIntegerField()
      5. 字符串类型
        1. varchar
          models.CharField(max\_length=100)
        2. longtext
          models.TextField()
      6. 时间日期类型
        1. 年月日
          models.DateField()
        2. 年月日时分秒
          models.DateTimeField()
        3. 一段时间,在数据库中是int类型,底层是 Python timedelta 实现
          models.DurationField()
      7. 浮点型
        1. models.FloatField()
        2. 可以指定整数多少位,小数多少位
          models.DecimalField()
      8. 其它字段
        1. 邮箱
          models.EmailField()
        2. models.ImageField()
        3. models.FileField()
        4. models.FilePathField()
        5. models.URLField()
        6. models.UUIDField()
        7. IP地址,可以是IPV4,也可以是IPV6
          models.GenericIPAddressField()
    2. 关系型字段
      1. 一对一
        models.OneToOneField(Model)
      2. 多对一
        models.ForeignKey(Model)
      3. 多对多
        models.ManyToManyField(Model)
    3. 字段类型参数
      1. 所有字段都有的参数
        1. db_column='name'
        2. primary_key=True
        3. verbose_name='别名或者注释'
        4. unique=True
        5. null=True,blank=True
        6. db_index=True 给表单建立索引
        7. help_text='' 表单中显示帮助信息
        8. editable=False 表单不可编辑
      2. 个别字段才有的参数
        1. 给CharField 指定最大长度 max_length=100
        2. 时间
          1. unique_for_date=True
          2. unique_for_month=True
          3. auto_now=True 更新时间
          4. auto_now_add=True 新增时间
        3. 浮点型 Decimal
          1. max_digits=4 表示一共有多少位数
          2. decimal_places=2 表示小数有多少位
      3. 关系型字段的参数
        1. related_name='name' 反向查询时候可能会用到
        2. on_delete=value
          value的值
          1. CASCADE:删除引用的对象时,也删除引用它的对象
          2. PROTECT:禁止删除引用的对象。SQL等价物:RESTRICT。
          3. SET_NULL:将引用设置为NULL(要求字段可以为空),当字段设置null=True才可以使用
          4. SET_DEFAULT:设置默认值。只有当字段设置了default参数时才能使用 SQL等价物:SET DEFAULT。
          5. SET(value 或者 函数返回值):设置给定值。这个不是SQL标准的一部分,完全由Django处理。
          6. DO_NOTHING:SQL等价物:NO ACTION。
      4. 自关联
        1. 写法一:
          modles.ForeignKey('self',verbose_name='自关联')
        2. 写法二:
          modles.ForeignKey('Model',verbose_name='自关联')
  3. 元数据,Meta类定义了一些元数据的信息,Meta类的字段如下:
    1. db_table
    2. ordering 列表或者元组形式
    3. verbose_name 别名
    4. verbose_name_plural 别名复数
    5. abstract 不同步到数据库,只是用于被别的类继承
    6. permissions 定义权限
    7. managed 是否按照Django规则管理模型类 默认是True
    8. unique_together=()/((),()) 对应MySQL中的联合唯一约束
    9. app_label 指定模型属于哪个应用(如果在settings里面已经注册过应用的话,就不用写这个字段了)
    10. db_tablespace 定义数据库表空间的名字
  4. Django 数据表操作
    1. 更改数据表
      1. 删除数据库表步骤
        1. 删除对应的模型类代码
        2. 删除migrationd文件夹下面的模型类
        3. 删除Django的migrations表中对应的记录
        4. 删除数据库表
    2. 导入数据
      1. Django shell 导入数据 引入模型 调用模型对象的save方法
      2. 自己定义一个脚本批量导入数据
      3. fixtures Django serialization -> model 保存
        1. python3 manage.py dumpdata > data.json
        2. python3 manage.py loaddata data.json
      4. 通过数据库客户端或则source文件导入数据
    3. 导出数据
      1. python3 manage.py dumpdata > data.json
      2. pycharm 导出
      3. mysqldump 导出
    4. 数据操作
      1. 返回QuerySet 的 API
        1. all(),filter(),order_by(),exclude(),reverse(),distinct()
        2. extra(),defer(),only() 实现字段别名,排除一些字段,选择一些字段
        3. values(),values_list() 获取字典或者元组形式的结果集
        4. dates(),datetimes() 根据时间日期获取查询集
        5. union(),intersection(),difference() 并集,交集,差集;MySQL Innodb 只支持并集
        6. select_related() 一对一、多对一查询优化,prefetch_related() 一对多、多对多查询优化。 反向查询
        7. annotate() 使用聚合计数,求和,平均数,raw() 执行原生SQL
          annotate()对分组后的结果进行统计
        8. Model.objects.get().子表的表名 _set.all()
      2. 不返回QuerySet 的 API
        1. 获取对象 get(),get_or_create(),first(),last(),latest(),earliest(),in_bulk()
        2. 创建对象 create(),bulk_create(),create_or_update() 创建,批量创建,创建或更新
        3. 更新对象 update(),update_or_create() 更新,更新或创建
        4. 删除对象 delete() 使用filter 过滤
        5. 其它操作 exists(),count(),aggregate() 判断是否存在,统计个数,聚合
          aggregate() 是对这个数据表中的数据进行统计
      3. 自定义聚合查询
    5. F对象和Q对象
      1. F对象:操作字段的数据
      2. Q对象:结合 AND , OR ,NOT, | , ~ , & 实现复杂的查询

注: 本文知识点是根据自己的项目经验及慕课网的教学视频整理所得,
如需转载请注明出处:https://www.cnblogs.com/zhuchenglin/p/10223596.html