Django中多租户的最佳解决方案是什么?
我正在用Django开发一个物业管理应用,最终会有多个公司,每个公司又有多个用户。我希望每个公司都有自己的路径。例如,mysite.com/company1/property/1/
不过,最终我想把不同公司的条目集中到一个网站上,所以我希望把所有数据放在一个数据库里。
我想到的一种方法是建立一个公司模型,然后让每个物业有一个指向公司的外键(ForeignKey)。但我不太确定怎么编写视图,只显示或修改当前公司的数据。
那么,最好的做法是什么呢?
补充说明:理想情况下,我想创建一个视图或辅助方法,执行一个查询,限制结果只显示当前公司的物业,然后把查询结果和请求传递给另一个视图。我希望有这样的URL结构:mysite.com/company1/listproperties
。这样,这个功能就会限制物业只显示公司1的,然后我想用URL的第二部分来决定使用哪个视图(比如listProperties或searchProperties),并把剩下的作为参数传递。不过,我不太确定怎么编写这个过滤视图和处理URL。
1 个回答
你这里问了几个问题。第一个是:如何建模不同模型之间的关系,第二个是:如何展示一个公司的视图。
对于第一个问题,Django通过数据建模来处理这种关系。这里有关于关系的文档教程:https://docs.djangoproject.com/en/dev/topics/db/models/#relationships
在你的例子中,物业和公司的关系是“多对一”,这意味着一个公司可以有很多物业,但一个物业只能属于一个公司。在Django中(我给你的链接里),通常是通过在“多”的模型中添加一个外键来实现,也就是在你的例子中是物业。以下是我会怎么做:
class Property(models.Model):
owner = models.ForeignKey(Company)
这也让你可以查询这些关系,从而解决第二个问题。
如果我有一个公司c
,我可以像这样访问与它相关的所有物业:
c.property_set.all()
# => [Property <MyProperty>, Property <OtherProperty>, ...]
这是你在视图中要执行的查询,然后再传递给模板。
这里有一个Django提供的关于这个“多对一”关系的例子,你可能会觉得有用:https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_one/。