使用特定模型强制或测试所有ForeignKey字段的删除行为



假设我有一个代理用户模型作为

class UserWithProfile(User):
profile_description = models.TextField()
class Meta:
proxy = True
ordering = ('first_name', )

我想确保在删除此配置文件时,将来可能与UserWithProfile条目关联的所有数据都会被删除。换句话说,我想保证引用该模型的所有现有和未来ForeignKey字段的on_delete行为。

如何实现检查此项的测试,或者在实现另一个on_delete行为时引发错误?

我知道有可能制作一个自定义的ForeignKey类,这就是我可能要做的。。。

class UserWithProfileField(models.ForeignKey):
def __init__(self, *args, **kwargs):
kwargs.setdefault('to', UserWithProfile)
kwargs.setdefault('on_delete', models.CASCADE)
super().__init__(*args, **kwargs)

然而,这并不能阻止未来的用户使用具有不同on_delete行为的ForeignKey类。

您可以覆盖on_delete参数而不是setdefault

class UserWithProfileField(models.ForeignKey):
def __init__(self, *args, **kwargs):
kwargs['to']= UserWithProfile
kwargs['on_delete']= models.CASCADE
super().__init__(*args, **kwargs)

不管用户现在将对to=…on_delete=…使用什么,它都将使用UserWithProfileCASCADE

严格来说,当然仍然可以尝试更改ForeignKey的属性,但这更为复杂,尤其是因为Django构造了一个ForeignObjectRel对象来存储关系细节。

请注意,代理模型[Django-doc]不用于向模型中添加exta字段。这更多的是改变顺序等,并定义新的/其他方法。

我没有得到你开始使用的不变量:

  • 是否要删除对UserUserWithProfile的引用无关紧要,因为它们是同一个表
  • 您无法监督其他表和模型作者的操作,以及他们指向此表的形状或形式。如果他们使用任何类型的ForeignKey都可以,但他们也可以使用不受约束的(integer?(字段指向表

你能做一个测试,引导数据库和所有东西,迭代所有模型(包括在这个应用程序和其他应用程序中(,并检查那里的每个ForeignKey,看看它是否指向这个模型,并且设置正确吗?我认为,这应该达到预期目标。

最新更新