python - 在 Django 模型字段中自定义 `on_delete` 参数函数

标签 python django

我有一个 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_deletepre_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/

相关文章:

python - Django Createview保存表单并根据外键的id重定向到页面

django - 显示并序列化 select_related() 模型方法的结果

python - 使用 operator.itemgetter() 作为排序键时,有没有办法转换值?

python - 如何将 yaml.load_all 与 fileinput.input 一起使用?

即使 __init__.py 存在,python 导入也会失败

python - Django 单元测试失败,找不到表

python - itertools.groupby() 有什么用?

python - 如何在 pyqt 中嵌入 matplotlib - For Dummies

javascript - 事件发生时如何将值传递给 Django 中的 url?

django - 在 Django 中使用 Contrib.Auth 生成登录和注册表单