首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除Django Orphan外键值?

如何清除Django Orphan外键值?
EN

Stack Overflow用户
提问于 2014-01-22 00:14:32
回答 1查看 725关注 0票数 0

我正在创建一个模型,它指的是第三方包中的一个模型--芹菜(CrontabSchedule和PeriodicTask)。我的模型(让我们称之为ScheduledRun)将包含一个PeriodicTask的外键。

我知道,如果我删除外键本身,就会发生串级删除,而引用该外键的父母也会被删除。(除非被on_delete覆盖.)

但是,由于我将ScheduledRun指向PeriodicTask的FK,所以删除ScheduledRun时不会自动删除PeriodicTask。(也不应该有其他模型指向该外键!)

那么,我如何才能清除那些孤儿的PeriodicTasks --也就是说,当模型实例不再指向它时。

我可以添加一个post_delete信号并以这种方式检查它(这个例子是删除与周期性任务无关的CrontabSchedules ):

代码语言:javascript
复制
# 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()

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

我可以将表PeriodicTask子类为ScheduledRun .但不愿将其与第三方模式紧密结合。

这就好像我想要一个.delete(do_not_cascade=True),如果它由于约束而失败,就忽略它的失败。如果它成功了,那它就是一个孤儿。on_delete=DO_NOTHING与此类似,但我只希望它暂时用于单个删除的范围,并且我不想修改第三方包。

有其他/更好的方法来处理这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 17:07:59

这是我的解决办法..。看起来它可能足够强壮了。我的目标是只删除外键值,如果没有其他模型实例仍然引用它。

因此,我要尝试的是基于每个相关键值为None的delete:

代码语言:javascript
复制
# 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()

如果我能说:

代码语言:javascript
复制
instance.crontab.delete(NO_CASCADE=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21271754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档