一:模型的概念

模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段
  • Django 提供了一个自动生成访问数据库的 API

    1:定义模型

  • 定义两个模型 Userinfo 和UserToken,继承了django.db.models.Model ```python

    导入django.db.models

    from django.db import models

    继承django.db.models.Model

    class Userinfo(models.Model): USER_TYPE = (

    1. (1, '普通用户'),
    2. (2, 'VIP'),
    3. (3, 'SVIP')

    ) user_type = models.IntegerField(choices=USER_TYPE, blank=True, null=True) userName = models.CharField(max_length=10) userPwd = models.CharField(max_length=100) userTelphone = models.CharField(max_length=10) userAddress = models.CharField(max_length=10) userAge = models.CharField(max_length=4)

class UserToken(models.Model): user = models.OneToOneField(Userinfo, on_delete=models.CASCADE) token = models.CharField(max_length=64)

  1. - user_typeuserName等为模型的字段,每个字段都被指定为一个类的属性,且每个属性映射为一个数据库列
  2. - 一个 `id` 字段会被自动添加,但是这种行为可以被改写
  3. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/662776/1595988669543-67c7bf47-ae9f-4699-b71d-eef138317d86.png#align=left&display=inline&height=188&margin=%5Bobject%20Object%5D&name=image.png&originHeight=376&originWidth=1300&size=63296&status=done&style=none&width=650)
  4. - 会在数据库中创建一个数据库表
  5. - 表的名称 appname`_modelsname` 是自动从某些模型元数据中派生出来,但可以被改写
  6. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/662776/1595988590930-aec39f77-fbd1-4fc4-a884-042cc592e674.png#align=left&display=inline&height=103&margin=%5Bobject%20Object%5D&name=image.png&originHeight=205&originWidth=233&size=10866&status=done&style=none&width=116.5)
  7. - Django 依据你在 [配置文件](https://docs.djangoproject.com/zh-hans/3.0/topics/settings/) 中指定的数据库后端生成对应的 SQL 语句。
  8. <a name="7gor8"></a>
  9. ## 2:使用模型
  10. 两条命令进行数据迁移
  11. ```python
  12. # 生成迁移文件
  13. python manage.py makemigrations appNames
  14. # 同步到数据库中
  15. python manage.py migrate appNames

二:模型字段说明

  • 模型中最重要且唯一必要的是数据库的字段定义
  • 字段在类属性中定义。定义字段名时不应使用与 模型 API 冲突的名称, 如 clean, save, or delete

    1:字段类型

    模型中每一个字段都应该是某个 Field 类的实例, Django 利用这些字段类来实现以下功能:

  • 字段类型用以指定数据库数据类型(如:INTEGER, VARCHAR, TEXT)。

  • 在渲染表单字段时默认使用的 HTML 视图 (如: <input type="text">, <select>)。
  • 基本的有效性验证功能,用于 Django 后台和自动生成的表单。

Django 内置了数十种字段类型;你可以在 模型字段参考 中看到完整列表。如果 Django 内置类型不能满足你的需求,你可以很轻松地编写自定义的字段类型。
image.png

2:字段选项

  • 每一种字段都需要指定一些特定的参数。 例如, CharField (以及它的子类)需要接收一个 max_length 参数,用以指定数据库存储 VARCHAR 数据时用的字节数。
  • 一些可选的参数是通用的,可以用于任何字段类型,,下面介绍一部分经常用到的通用参数:

1:[null](https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#django.db.models.Field.null)如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False
2:[blank](https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#django.db.models.Field.blank):如果设置为 True,该字段允许为空。默认为 False。注意该选项与null 不同, null 选项仅仅是数据库层面的设置,然而 blank 是涉及表单验证方面。如果一个字段设置为 blank=True ,在进行表单验证时,接收的数据该字段值允许为空,而设置为 blank=False 时,不允许为空。
3:[choices](https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#django.db.models.Field.choices)
一系列二元组,用作此字段的选项。如果提供了二元组,默认表单小部件是一个选择框,而不是标准文本字段,并将限制给出的选项。
image.png

3:自动设置主键

  • 默认情况下, Django 会给每一个模型添加下面的字段,这是一个自增的主键

    1. id = models.AutoField(primary_key=True)
  • 如果你想自己指定主键, 在你想要设置为主键的字段上设置参数 primary_key=True。如果 Django 看到你显式地设置了 Field.primary_key,将不会自动在表(模型)中添加 id 列。

  • 每个模型都需要拥有一个设置了 primary_key=True 的字段(无论是显式的设置还是 Django 自动设置)

image.png

4:字段备注名

![image.png](https://cdn.nlark.com/yuque/0/2020/png/662776/1596013910142-29b3439c-ce88-45f6-8c1c-a9d7693af46f.png#align=left&display=inline&height=221&margin=%5Bobject%20Object%5D&name=image.png&originHeight=441&originWidth=1276&size=68414&status=done&style=none&width=638)

  • 如果未指定该参数值, Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格

image.png

5:关联关系

5.1:多对一关联【models.ForeignKey

  • 定义一个多对一的关联关系,使用 django.db.models.ForeignKey 类。就和其它 Field 字段类型一样,只需要在你模型中添加一个值为该类的属性
  • ForeignKey 类需要添加一个位置参数,即你想要关联的模型类名

image.png

5.2:多对多关联【models.ManyToManyField

  • 定义一个多对多的关联关系,使用 django.db.models.ManyToManyField 类。就和其他 Field 字段类型一样,只需要在你模型中添加一个值为该类的属性。
  • [ManyToManyField](https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#django.db.models.ManyToManyField) 类需要添加一个位置参数,即你想要关联的模型类名

  • 5.2.1:在多对多关系中添加额外的属性字段

5.3:一对一关联

6:跨文件模型

7:字段命名限制

8:自定义字段类型

三:Meta选型

四:模型属性

五:模型方法

1:重写之前定义的模型方法

2:执行自定义sql

六:模型继承

1:抽象基类

1.1:Meta继承

1.2:对relate_name和related_query_name要格外小心

2:多表继承

2.1:Meta和多表继承

2.2:继承与反向关系

2.3:指定父类链接字段

3:代理模型

3.1:QuerySet仍回返回请求的的模型

3.2:基类约束

3.3:代理模型管理器

3.4:代理继承和未托管的模型间的区别

4:多重继承

5:hiding字段不能用

七:同包下的模型管理