ManyToManyField和ForeignKey之间的Django约束

时间:2018-01-17 20:40:21

标签: django database django-models orm

考虑我有以下模型:

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)

如何在模型级别添加这样的约束?

1 个答案:

答案 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)

希望这有帮助!