【问题标题】:django multiple models with same foreign keydjango 具有相同外键的多个模型
【发布时间】:2020-12-23 03:03:09
【问题描述】:

我有 django 应用程序,它可以跟踪各种客户的合同、位置和产品。合同、位置每个都使用 ForeignKey 引用客户端。

class Location(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    ...

class Contract(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    ...

我还有一个产品将部署在一个位置,根据合同,为客户。我需要在产品中包含客户,因为引用用于保护该客户的记录。

class Product(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    contract = models.ForeignKey(Contract, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, on_delete=models.CASCADE)
    ....

确保永远不会创建包含所有 3 个模型的不同客户参考的产品的最佳方法是什么?我在想我可以使用 pre_save 信号,但我宁愿使用数据库约束,但我没有看到数据库约束来强制执行此操作。

【问题讨论】:

  • 这看起来像是不好的建模,如果客户端必须相同,为什么所有这些模型都有客户端
  • @iklinac 我们需要能够输入与客户端相关联的位置。我们还需要签订与客户相关的合同。这些对象不相关。我可以从产品中删除客户参考,但我仍然会遇到同样的问题。你会建议我如何建模?
  • aha,它看起来像同一个数据库上的多租户架构,客户端是否编写自己的位置等,因为您始终可以通过覆盖默认管理器来限制当前客户端的设置
  • @iklinac 这是多租户。客户可以写入自己的数据...我们有可以写入客户记录子集的代理,我们有可以写入所有客户记录的代理。

标签: django django-models django-signals django-constraints


【解决方案1】:

您是否查看过unique_together。我认为这会做你想做的事。

还要记住以下几点。

UniqueConstraint 提供了比 unique_together 更多的功能。 unique_together 将来可能会被弃用。

【讨论】:

  • unique_together 确保表中的不同字段是唯一的,以避免重复的冲突记录。我想确保它们都引用相同的记录。
  • 所以基本上,你想要的是合同和位置也链接到产品中的同一个客户端。如果我理解正确的话。
  • 恐怕你不能在数据库级别做到这一点。相反,要么更新您的模型保存方法并以编程方式添加功能。正如你提到的pre_save 是一个不错的选择。但是,如果您不想使用 db 信号,那么这个答案可能会有所帮助stackoverflow.com/a/14471010/5084737
  • 谢谢。这基本上就是我目前正在做的事情。我在覆盖的保存方法中引发了完整性错误。但是,我注意到,在约束条件下,django 实际上将用户返回到带有注释的输入页面,因此很容易更新。当我手动抛出完整性错误(或验证错误)时,它会停止并显示错误页面。也许我应该只是想弄清楚如何使错误将用户返回到输入页面。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多