通过on_delete 选项,Django 提供了各种替代方法来处理具有要删除的对象的外键的对象。
我想知道是否有一种方法可以做类似的事情,但有条件。这是场景。我正在使用 Django 1.5 的新自定义用户模型,并且我的所有用户都有一个外键到站点。像这样:
class TenantSiteUser(AbstractUser):
site = models.ForeignKey(Site, null=True)
如果一个站点被删除,那么我宁愿删除所有链接到该站点的非超级用户(即类似 KASKADE 的行为),因为它们的存在现在毫无意义。但是,如果它是超级用户,我宁愿将用户的站点设置为 null(即 SET_NULL)并让它们保持存在,因为这可能是我或与我一起工作的人,我们往往不想无意中删除自己。
有什么我可以覆盖的东西来手动检查并实现这种类型的 on_delete 行为吗?
编辑:这是最终为我工作的代码,基于@Kevin的回答和对现有处理程序如何工作的一些研究:
def NULLIFY_SUPERUSERS_ELSE_CASCADE(collector, field, sub_objs, using):
superusers = []
for user in sub_objs:
if user.is_superuser:
sub_objs = list(sub_objs)
sub_objs.remove(user)
superusers.append(user)
CASCADE(collector, field, sub_objs, using)
if len(superusers):
collector.add_field_update(field, None, superusers)
class TenantSiteUser(AbstractUser):
site = models.ForeignKey(Site, null=True, on_delete=NULLIFY_SUPERUSERS_ELSE_CASCADE)