Django ForeignKey on_delete 参数全解析:从源码到实战配置
本文深入解析Django 2.0+中ForeignKey的on_delete参数,结合源码说明其必要性。详细阐述CASCADE、PROTECT、SET_NULL、SET_DEFAULT及自定义SET()五种删除行为,并解释to、related_name、to_field等关键参数的作用与限制,帮助开发者根据业务需求选择合适的数据关联策略。
Django外键参数必要性及源码分析
在Django 2.0及以上版本中,定义外键或一对一关系时,必须显式指定on_delete参数。通过查看框架源码可知,这是强制要求,旨在明确数据关联在源记录删除时的行为。
ForeignKey源码关键参数解析
class ForeignKey(ForeignObject):
"""
Provide a many-to-one relation by adding a column to the local model
to hold the remote value.
By default ForeignKey will target the pk of the remote model but this
behavior can be changed by using the ``to_field`` argument.
"""
# Field flags
many_to_many = False
many_to_one = True
one_to_many = False
one_to_one = False
rel_class = ManyToOneRel
empty_strings_allowed = False
default_error_messages = {
'invalid': _('%(model)s instance with %(field)s %(value)r does not exist.')
}
description = _("Foreign Key (type determined by related field)")
def __init__(self, to, on_delete, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs):
- to:指定关联的目标模型或表名。
- on_delete:定义当源表中的关联记录被删除时,外键字段应采取的操作策略。
- related_name:用于反向查询的参数。设置后,可通过被关联表实例反向访问外键所在表的数据。若未指定,默认值为set_表名。
- to_field:指定关联的字段,默认为目标表的主键。MySQL仅支持主键作为外键,即使未显式定义主键,Django也会自动创建。若采用数据库优先(DB-first)策略且未手动创建主键,数据库可能默认使用隐藏字段DB_ROW_ID作为主键。
on_delete五种删除策略详解
on_delete参数的具体配置选项如下。
级联删除:CASCADE
CASCADE:级联删除。当关联表中的记录被删除时,当前外键指向的记录也会同步删除。
保护模式:PROTECT
PROTECT:保护模式。若启用此选项,尝试删除关联记录时将抛出ProtectedError异常,阻止删除操作。
置空模式:SET_NULL
SET_NULL:置空模式。删除关联记录时,外键字段值被设为NULL。此选项要求字段定义时包含blank=True和null=True,允许字段为空。
默认值模式:SET_DEFAULT
SET_DEFAULT:设置默认值。删除关联记录时,外键字段值恢复为定义的默认值。因此,定义外键时需确保设置了默认值。
自定义值:SET()
SET():自定义值。允许传入一个可调用对象或具体值,该值必须是有效的实体引用。
以上内容涵盖了Django外键删除行为的核心配置,希望能为读者提供清晰的技术参考,助力项目开发。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













