【发布时间】: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