Django数据模型字段类型详解与外键关联配置指南

Miles
Miles
发布时间:2026-10-13 | 5人浏览过
原创

本文系统解析Django数据模型中的常用字段类型,包括AutoField、BigIntegerField、CharField等,并深入探讨外键关联中的on_delete策略与db_constraint参数配置。通过具体代码示例,说明如何处理级联删除、置空及自定义行为,同时介绍ManyToManyField中through参数的应用,帮助开发者避免关联数据误删及查询困难等问题。

Django数据模型字段类型详解

字段类型(Field types)

1、AutoField

AutoField 是一个基于 ID 自动增长的 IntegerField。通常情况下,开发者无需手动指定该字段。如果在模型中未显式定义主键,Django 会自动创建一个名为 id 的主键字段。

2、BigIntegerField

BigIntegerField 用于存储 64 位整数,其行为与 IntegerField 类似,但取值范围更广,从 -9223372036854775808 到 9223372036854775807。在表单中,其默认的小部件(widget)为 TextInput。

3、BooleanField

BooleanField 用于存储布尔值(true 或 false)。其默认的表单小部件是 CheckboxInput。若需要允许空值(null),应使用 NullBooleanField 字段。

4、CharField

class CharField(max_length=None[, **options]) CharField 用于存储字符串,适用于短文本及较长文本。对于超大文本,建议使用 TextField。其默认的表单小部件为 TextInput。CharField 必须传入 max_length 参数,用于指定字段的最大字符数。该限制同时在数据库层级和 Django 的数据验证层级生效。

5、DateField

class DateField([auto_now=False, auto_now_add=False, **options]) DateField 利用 Python 的 datetime.date 实例来表示日期。它提供两个额外的可选参数: DateField.auto_now:每次保存对象时,Django 会自动将该字段的值设置为当前时间。通常用于记录“最后修改”时间。需注意,此处使用的是当前日期而非默认值,因此不能通过重写默认值来改变保存时间。 DateField.auto_now_add:在对象首次创建时,Django 自动将该字段的值设置为当前时间,通常用于记录对象创建时间。同样,它使用的是当前日期,而非默认值。 默认的表单小部件为 TextInput。 注意:当 auto_now 或 auto_now_add 设置为 True 时,字段会自动具备 editable=True 和 blank=True 的属性。

6、DateTimeField

class DateTimeField([auto_now=False, auto_now_add=False, **options]) DateTimeField 利用 datetime.datetime 实例表示日期和时间。其接受的参数与 DateField 相同。 默认的表单小部件为 TextInput。Django 的 admin 后台使用两个带有 JavaScript 快捷选项的 TextInput 分别处理日期和时间的输入。

7、DecimalField

class DecimalField(max_digits=None, decimal_places=None[, **options]) DecimalField 使用 Decimal 实例表示固定精度的十进制数。它有两个必需参数: DecimalField.max_digits:允许的最大数字位数。 DecimalField.decimal_places:允许的最大小数位数。 例如,若要存储最大值为 999 且带有两位小数的数字,可以这样配置:

models.DecimalField(..., max_digits=5, decimal_places=2) 若要存储约十亿级且带有 10 位小数的数字,配置如下: models.DecimalField(..., max_digits=19, decimal_places=10)

8、EmailField

class EmailField([max_length=75, **options]) EmailField 是一个带有电子邮件地址合法性检测的 CharField。 注意:最大长度默认为 75,这无法存储所有符合 RFC3696/5321 标准的电子邮件地址。如需存储所有合规地址,请设置 max_length=254。设置为 75 是历史遗留问题。

9、TextField

class TextField([**options]) TextField 用于存储大文本。其默认的表单小部件为 Textarea。

外键关联配置:on_delete与db_constraint实战

ps:下面看下django数据模型on_delete, db_constraint的使用

在开发过程中,可能会遇到删除某张表的一条记录后,其他表中关联该字段的记录也被意外删除的情况。即使设置了 db_constraint=False,如果未同时设置 null=True 和 blank=True,以及 on_delete=models.SET_NULL,关联关系仍可能断裂。此前若使用 on_delete=models.CASCADE(默认级联删除),会导致数据丢失。此外,配置环境时如遗漏 'corsheaders.middleware.CorsMiddleware' 可能导致 AJAX 请求失败。

1.设置为null


class BookModel(models.Model):
 """
 图书
 """
 book_name = models.CharField(max_length=100, verbose_name='书名')
 # 表示外键关联到作者表,当作者表删除了该条数据,图书表中不删除,仅仅是把外键置空
 author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
 price = models.FloatField(verbose_name='价格')
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')

2.建表时其他参数的设置


CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

3.set的使用


def get_sentinel_user():
 return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
 user = models.ForeignKey(
  settings.AUTH_USER_MODEL,
  on_delete=models.SET(get_sentinel_user),
 )

4.ManyToMany参数(through,db_constraint)


class Book(models.Model):
 name=models.CharField(max_length=20)
 authors=models.ManyToMany('Author',through='Score')
class Author(models.Model):
 name=models.CharField(max_length=20)
class Score(models.Model):
 book=models.ForeignKey('Book')
 author=models.ForeignKey('Author')
 socre=models.IntegerField()
#######

如果仅使用 ManyToMany 字段,Django 会自动创建第三张关联表。可以通过 book.authors 字段进行增(add)、查(all)、重置(set)、删(remove)等操作。但此时无法为第三张表添加其他自定义字段。

如果不使用 ManyToMany 字段,而是通过自定义模型(如 Score)建立联系,虽然可以通过 Score 执行相关操作,但 Book 和 Author 表之间将失去直接联系,导致查询变得繁琐。

有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便业务,添加需要的字段

5.db_constraint


db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一般公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)
limit_choices_to
限制关联字段的对象范围
related_name
反向查询字段可以不用 表名小写,可以改名了
db_table
第三张表的名字
 models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL,db_constraint=False)

5.总结

如果两个表之间存在关联,首先设置 db_constraint=False 以切断物理约束,但保留跨表查询功能。其次,需设置 null=True 和 blank=True,以确保外键可以为空。

总结

以上所述是小编给大家介绍的django数据模型(Model)的字段类型解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表