如何清理django孤儿外钥匙值



我正在创建一个模型,该模型指的是第三方软件包中的模型-Celery(crontabschedule和ofertictictask)。我的模型(我们称其为" steeduledrun")将包含一个序列箱的外键。

我知道,如果我删除外键本身,级联删除将发生,并且提到该外键的父母也将被删除。(除非由on_delete覆盖...)

但是,由于我将SendiuuleDrun指向extrictAsk的FK的情况,当我删除SendiulEdrun时,extrictAsk不会自动删除。(也不应该像其他模型指向该外键一样!)

所以我如何清理孤儿的循序分式总金工程 - 即,当没有模型实例重点指向时。

我可以添加一个post_delete信号并以此方式检查(此示例正在删除与周期任务相关的无关crontabschedules:

# periodictask below is actually a related periodictask_set, 
# but in Django you refer to the empty set as 'periodictask=None'
CrontabSchedule.objects.filter(id=instance.crontab.id,
                               periodictask=None).delete()

但我不能保证不会其他可能导致级联下降的相关关系。

我可以将表个性套件作为SendiulEdrun的序列级别。。。

几乎好像我想要一个.delete(do_not_cascade = true),如果由于约束而失败,请忽略失败。如果成功了,那就是一个孤儿。on_delete = do_nothing与此相似,但我只希望在上暂时,对于单个删除的范围,我不想修改第三方软件包。

是否还有其他/更好的方法来处理?

这是我的解决方案...似乎足够强大。我的目标是仅在没有其他模型实例引用的情况下删除外键值。

所以,我将尝试的是基于每个相关密钥值的删除。

# This is a class method to my ScheduledRun class that has
# a foreign key to a PeriodicTask.  PeriodicTask has a 
# FK to a CrontabSchedule, which I'd like to "trim"
# if nothing points to that FK anymore.
@classmethod
def _post_delete(cls, instance, **kwargs):
    instance.periodic_task.delete()
    # Delete the crontab if no other tasks point to it.
    # This could cause a cascade if we don't check all related...
    filter = dict(id=instance.crontab.id)
    for related in instance.crontab._meta.get_all_related_objects():
        filter[related.var_name] = None
    assert('id' in filter)
    assert('schedule' in filter)
    assert('periodictask' in filter)
    CrontabSchedule.objects.filter(**filter).delete()

如果我可以说:

会更容易
instance.crontab.delete(NO_CASCADE=True)

相关内容

  • 没有找到相关文章

最新更新