假设我有一个代理用户模型作为
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=…
使用什么,它都将使用UserWithProfile
和CASCADE
。
严格来说,当然仍然可以尝试更改ForeignKey
的属性,但这更为复杂,尤其是因为Django构造了一个ForeignObjectRel
对象来存储关系细节。
请注意,代理模型[Django-doc]不用于向模型中添加exta字段。这更多的是改变顺序等,并定义新的/其他方法。
我没有得到你开始使用的不变量:
- 是否要删除对
User
或UserWithProfile
的引用无关紧要,因为它们是同一个表 - 您无法监督其他表和模型作者的操作,以及他们指向此表的形状或形式。如果他们使用任何类型的ForeignKey都可以,但他们也可以使用不受约束的(integer?(字段指向表
你能做一个测试,引导数据库和所有东西,迭代所有模型(包括在这个应用程序和其他应用程序中(,并检查那里的每个ForeignKey,看看它是否指向这个模型,并且设置正确吗?我认为,这应该达到预期目标。