一:模型的概念
模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。
- 每个模型都是一个 Python 的类,这些类继承
django.db.models.Model
模型类的每个属性都相当于一个数据库的字段
-
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, '普通用户'),
(2, 'VIP'),
(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)
- user_type、userName等为模型的字段,每个字段都被指定为一个类的属性,且每个属性映射为一个数据库列
- 一个 `id` 字段会被自动添加,但是这种行为可以被改写
![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)
- 会在数据库中创建一个数据库表
- 表的名称 appname`_modelsname` 是自动从某些模型元数据中派生出来,但可以被改写
![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)
- Django 依据你在 [配置文件](https://docs.djangoproject.com/zh-hans/3.0/topics/settings/) 中指定的数据库后端生成对应的 SQL 语句。
<a name="7gor8"></a>
## 2:使用模型
两条命令进行数据迁移
```python
# 生成迁移文件
python manage.py makemigrations appNames
# 同步到数据库中
python manage.py migrate appNames
二:模型字段说明
- 模型中最重要且唯一必要的是数据库的字段定义
字段在类属性中定义。定义字段名时不应使用与 模型 API 冲突的名称, 如
clean
,save
, ordelete
等1:字段类型
模型中每一个字段都应该是某个
Field
类的实例, Django 利用这些字段类来实现以下功能:字段类型用以指定数据库数据类型(如:
INTEGER
,VARCHAR
,TEXT
)。- 在渲染表单字段时默认使用的 HTML 视图 (如:
<input type="text">
,<select>
)。 - 基本的有效性验证功能,用于 Django 后台和自动生成的表单。
Django 内置了数十种字段类型;你可以在 模型字段参考 中看到完整列表。如果 Django 内置类型不能满足你的需求,你可以很轻松地编写自定义的字段类型。
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)
一系列二元组,用作此字段的选项。如果提供了二元组,默认表单小部件是一个选择框,而不是标准文本字段,并将限制给出的选项。
3:自动设置主键
默认情况下, Django 会给每一个模型添加下面的字段,这是一个自增的主键
id = models.AutoField(primary_key=True)
如果你想自己指定主键, 在你想要设置为主键的字段上设置参数
primary_key=True
。如果 Django 看到你显式地设置了Field.primary_key
,将不会自动在表(模型)中添加id
列。- 每个模型都需要拥有一个设置了
primary_key=True
的字段(无论是显式的设置还是 Django 自动设置)
4:字段备注名
- 除了
ForeignKey
,ManyToManyField
和OneToOneField
,任何字段类型都接收一个可选的位置参数verbose_name
![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 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格
5:关联关系
5.1:多对一关联【models.ForeignKey
】
- 定义一个多对一的关联关系,使用
django.db.models.ForeignKey
类。就和其它Field
字段类型一样,只需要在你模型中添加一个值为该类的属性 ForeignKey
类需要添加一个位置参数,即你想要关联的模型类名
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:在多对多关系中添加额外的属性字段