【问题标题】:Django constraint between ManyToManyField and ForeignKeyManyToManyField 和 ForeignKey 之间的 Django 约束
【发布时间】:2018-06-26 20:06:22
【问题描述】:

考虑我有以下模型:

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)

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

【问题讨论】:

  • 嗨,一个盒子可以成为多个货物的一部分吗?或者每个箱子都是一个货物的一部分?我看到您将它作为 ManyToManyField,但我想了解从概念上讲这是否是它需要建模的方式

标签: django database django-models orm


【解决方案1】:

我最初的想法是,这个问题的一个很好的解决方案是定义一个自定义的 RelatedManager,它会覆盖 add() 方法并在您实际执行链接之前验证用户是否相同。但是,在互联网上搜索了一段时间后,我无法找到在 ManyToManyField 上执行自定义相关管理器的方法(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)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2016-06-23
    • 1970-01-01
    • 2016-03-28
    • 2017-05-07
    相关资源
    最近更新 更多