考虑我有以下模型:
class Cargo(models.Model):
name = models.CharField(default='')
owner = models.ForeignKey(User, on_delete=models.CASCADE)
class Box(models.Model):
name = models.CharField(default='')
owner = models.ForeignKey(User, on_delete=models.CASCADE)
tags = models.ManyToManyField(Cargo, blank=True)
当我向不同的主人添加一些货物对象时,我想避免这种情况。例如:
cargo = Cargo(owner=1)
box = Box(owner=2)
box.add(cargo)
如何在模型级别添加这样的约束?
答案 0 :(得分:0)
我最初的想法是,解决这个问题的一个很好的解决方案是定义一个自定义的RelatedManager,它覆盖add()方法,并在实际执行链接之前验证用户是否相同。但是,在网上搜索了一段时间之后,我无法找到在ManyToManyField上进行自定义RelatedManager的方法(RelatedManager上的文档)。
作为一种解决方法,我建议您在Box模型上创建一个名为addCargo
的方法,用于添加货物。然后,该方法可以在添加货物之前强制执行用户的验证。它可能看起来像:
class Box(models.Model):
name = models.CharField(default='')
owner = models.ForeignKey(User, on_delete=models.CASCADE)
tags = models.ManyToManyField(Cargo, blank=True)
def addCargo(self, cargo):
if self.owner.id != cargo.owner.id:
raise ValueError("cargo and box must have same user")
self.tags.add(cargo)
您添加货物的代码如下:
cargo = Cargo(owner=1)
box = Box(owner=2)
box.addCargo(cargo)
希望这有帮助!