Django中多租户的最佳解决方案是什么?

3 投票
1 回答
706 浏览
提问于 2025-04-18 10:01

我正在用Django开发一个物业管理应用,最终会有多个公司,每个公司又有多个用户。我希望每个公司都有自己的路径。例如,mysite.com/company1/property/1/

不过,最终我想把不同公司的条目集中到一个网站上,所以我希望把所有数据放在一个数据库里。

我想到的一种方法是建立一个公司模型,然后让每个物业有一个指向公司的外键(ForeignKey)。但我不太确定怎么编写视图,只显示或修改当前公司的数据。

那么,最好的做法是什么呢?

补充说明:理想情况下,我想创建一个视图或辅助方法,执行一个查询,限制结果只显示当前公司的物业,然后把查询结果和请求传递给另一个视图。我希望有这样的URL结构:mysite.com/company1/listproperties。这样,这个功能就会限制物业只显示公司1的,然后我想用URL的第二部分来决定使用哪个视图(比如listProperties或searchProperties),并把剩下的作为参数传递。不过,我不太确定怎么编写这个过滤视图和处理URL。

1 个回答

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/

撰写回答