首页 > 解决方案 > Django - 收集器依赖项不包括可删除模型是可空字段的模型

问题描述

假设我有以下模型:

class Foo(models.Model):
    ...

class Bar(models.Model):
    foo = models.ForeignKey(Foo)

class Baz(models.Model):
    foo = models.ForeignKey(Foo, null=True, blank=True)

如果我尝试使用 Django Collector 获取 a 的依赖项Foo,如下所示,我将获取所有依赖项,包括Bar,除了Baz

from django.db.models.deletion import Collector

def get_related_models(obj):
    collector = Collector(using='default')    
    collector.collect([obj])
    return collector.dependencies.get(obj.__class__, set())

get_related_models(Foo.objects.get(pk=1))

我怀疑原因是那Foo是 中的一个可为空的字段Baz,所以Collector可能认为删除 aFoo只会使相应Baz对象的Foo字段指向空。但是,如果您删除一个Foo相关的Baz也将被删除。

我想通知我的用户Baz依赖于Foo,尽管该Foo字段Baz可以为空。

标签: pythondjango

解决方案


我当前的解决方案涉及覆盖Collector.add方法 fromdjango.db.models.deletion以便不再忽略可为空的关系:

def add(...):
    # same default code goes here
    ...

    # overriden behavior (check for nullable was removed)
    if source is not None:
        # same code
        ....

我不确定这是否是最好的解决方案,但自从我提交了代码后,该应用程序运行良好。如果出现由它引起的一些问题,我将更新此答案(或将其删除)。


推荐阅读