0x04 -- Django -- 模型介绍 -- 4 -- 其他

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 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。
  • 例外情况:ForeignKeyManyToManyFieldOneToOneField(此三者为关联关系)
# 备注名为: “person's first name” (作为第一个参数)
first_name = models.CharField("person's first name", max_length=30)

# 备注名为: “first name”  (默认情况)
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 – 字段命名限制

  1. 一个字段的名称不能是 Python 保留字,因为这会导致 Python 语法错误。比如:
class Example(models.Model):
    pass = models.IntegerField() # 'pass' 是一个 python 保留字
  1. 一个字段名称不能包含连续的多个下划线,原因在于 Django 查询语法的工作方式。比如:
class Example(models.Model):
    foo__bar = models.IntegerField() # 'foo__bar' 有两个下划线
  1. 字段名不能以下划线结尾,原因同上。

但是,这些限制是可以被解决的,因为字段名没要求和数据库列名一样。查看 db_column 选项。

SQL保留字,例如 join, where 或 select, 是 可以被用在模型字段名当中的,因为 Django 在对底层的 SQL 查询当中清洗了所有的数据库表名和字段名,通过使用特定数据库引擎的引用语法。


0x04 – 自定义字段类型

如果已经存在的模型字段不能满足你的需求,或者你希望支持一些不太常见的数据库列类型,你可以创建自己的字段类。在 编写自定义模型字段(model fields) 中提供了创建自定义字段的各方面内容。


2021年9月17日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值