0x00 – 自动设置主键
默认情况下,Django 给每个模型一个自动递增的主键,其类型在 AppConfig.default_auto_field 中指定,或者在 DEFAULT_AUTO_FIELD 配置中全局指定。 例如:
id = models.BigAutoField(primary_key=True)
如果你想自己指定主键, 在你想要设置为主键的字段上设置参数 primary_key=True 。如果 Django 看到你显式地设置了 Field.primary_key ,将不会自动在表(模型)中添加 id 列。
每个模型都需要拥有一个设置了 primary_key=True 的字段(无论是显式的设置还是 Django 自动设置)。
在早期版本中主键为隐式的 AutoField 字段,它是 IntegerField (整数类型)。 3.2 版本默认主键设置为的 BigAutoField 字段,它是一个64位整数(64 bit integer)。
所以在早期版本升级为3.2版本的时候,应该会看到配置DEFAULT_AUTO_FIELD的警告和提示。
0x01 – 字段备注名
- 任何字段类型都接收一个可选的位置参数
verbose_name (第一个位置) - 默认情况下:Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。
- 例外情况:
ForeignKey ,ManyToManyField 和 OneToOneField (此三者为关联关系)
first_name = models.CharField("person's first name", max_length=30)
first_name = models.CharField(max_length=30)
ForeignKey , ManyToManyField and OneToOneField 接收的第一个参数为模型的类名,后面可以添加一个 verbose_name 的关键字参数:
poll = models.ForeignKey(
Poll,
on_delete=models.CASCADE,
verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
verbose_name="related place",
)
0x02 – 跨文件模型
关联另一个应用中的模型:需要在定义模型的文件开头导入需要被关联的模型,然后就可以在其他有需要的模型类当中关联它了。比如:
from django.db import models
from geography.models import ZipCode
class Restaurant(models.Model):
zip_code = models.ForeignKey(
ZipCode,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
0x03 – 字段命名限制
- 一个字段的名称不能是 Python 保留字,因为这会导致 Python 语法错误。比如:
class Example(models.Model):
pass = models.IntegerField()
- 一个字段名称不能包含连续的多个下划线,原因在于 Django 查询语法的工作方式。比如:
class Example(models.Model):
foo__bar = models.IntegerField()
- 字段名不能以下划线结尾,原因同上。
但是,这些限制是可以被解决的,因为字段名没要求和数据库列名一样。查看 db_column 选项。
SQL保留字,例如 join, where 或 select, 是 可以被用在模型字段名当中的,因为 Django 在对底层的 SQL 查询当中清洗了所有的数据库表名和字段名,通过使用特定数据库引擎的引用语法。
0x04 – 自定义字段类型
如果已经存在的模型字段不能满足你的需求,或者你希望支持一些不太常见的数据库列类型,你可以创建自己的字段类。在 编写自定义模型字段(model fields) 中提供了创建自定义字段的各方面内容。
2021年9月17日
|