我有一个 IPv4Manage 模型,其中有一个 vlanedipv4network
字段:
class IPv4Manage(models.Model):
...
vlanedipv4network = models.ForeignKey(
to=VlanedIPv4Network, related_name="ipv4s", on_delete=models.xxx, null=True)
我们知道,在on_delete
参数上,我们一般填写models.xxx
,比如models.CASCADE
。
是否可以自定义一个函数,在那里填充?我想在那里做其他逻辑事情。
最佳答案
on_delete
的选项可以在 django/db/models/deletion.py
例如,models.SET_NULL 实现为:
def SET_NULL(collector, field, sub_objs, using):
collector.add_field_update(field, None, sub_objs)
models.CASCADE(稍微复杂一点)实现为:
def CASCADE(collector, field, sub_objs, using):
collector.collect(sub_objs, source=field.remote_field.model,
source_attr=field.name, nullable=field.null)
if field.null and not connections[using].features.can_defer_constraint_checks:
collector.add_field_update(field, None, sub_objs)
因此,如果您弄清楚这些参数是什么,那么您应该能够定义自己的函数以传递给模型字段的 on_delete
参数。 collector
很可能是 Collector
的一个实例(定义在同一个文件中,不确定它到底是做什么用的),field
很可能是模型字段被删除,sub_objs
可能是该字段关联到对象的实例,using
表示正在使用的数据库。
也有用于删除的自定义逻辑的替代方案,以防覆盖 on_delete 对您来说可能有点矫枉过正。
post_delete和 pre_delete允许您定义一些自定义逻辑以在删除实例之前或之后运行。
from django.db.models.signals import post_save
def delete_ipv4manage(sender, instance, using):
print('{instance} was deleted'.format(instance=str(instance)))
post_delete.connect(delete_ipv4manage, sender=IPv4Manage)
最后 you can override the delete()
method of the Model/Queryset ,但是请注意使用此方法进行批量删除的注意事项:
Overridden model methods are not called on bulk operations
Note that the delete() method for an object is not necessarily called when deleting objects in bulk using a QuerySet or as a result of a cascading delete. To ensure customized delete logic gets executed, you can use pre_delete and/or post_delete signals.
关于python - 在 Django 模型字段中自定义 `on_delete` 参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917926/