【问题标题】:What is the best solution for multi tenancy in Django?Django中多租户的最佳解决方案是什么?
【发布时间】:2014-06-18 13:55:23
【问题描述】:

我正在 Django 中开发一个物业管理应用程序,该应用程序最终将拥有多家公司,每家公司都有多个用户。我希望能够让每家公司都有自己的道路。例如mysite.com/company1/property/1/

虽然我最终想将来自不同公司的条目集中到一个站点上——所以我想将所有内容都保存在一个数据库中。

我能想到的一种方法是建立一个公司模型,然后让每个属性都有一个公司的外键。但是我不确定如何最好地编写视图代码,以便只为当前公司显示或修改。

最好的方法是什么?

编辑:理想情况下,我想创建一个视图/帮助器方法,该方法执行一个查询,将结果属性限制为公司,然后将查询集和请求传递给另一个视图。我想要一个 URL 结构,如:mysite.com/company1/listproperties。所以这个函数会将属性限制为 Company1,然后我想使用 URL 的第二部分来确定要使用的视图(listProperties、searchProperties),并将其余部分作为参数传递。但是我不确定如何编写第一个过滤视图和 URL 处理。

【问题讨论】:

    标签: python django multi-tenant


    【解决方案1】:

    你在这里问了几件事。 1:如何建模模型之间的关系,2:如何显示单个公司的视图

    对于问题一,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/。

    【讨论】:

    • 谢谢!这就是我的想法(相对于使用 ForeignKey 然后查询公司的子集。我很好奇是否有办法让我将这个过程排除在外。我可以创建一个视图/辅助函数吗?执行此查询,然后将查询集和请求传递给另一个视图?我想保留mysite.com/company1/listproperties url 结构。然后有一个处理初步过滤的filterCompany(request,company) 方法,然后有一个listProperties() 视图在过滤后的查询集中完成它需要做的工作。我该怎么做?
    • 我不完全确定您在问什么,但示例查询可能是这样的:Company.objects.get(pk=3).property_set.all()。给定一个公司 ID(pk=3),它会获得所有属性(假设我上面的数据模型)。要获得特定的,Company.objects.get(pk=3).property_set.get(pk=4)。现在你给它一个公司 ID 和财产 ID 并可能返回一些东西。
    • 我想避免将查询的公司部分编码到我的每个视图中。如果可能的话,我宁愿把它抽象出来,这样我就不需要在每个视图中都使用Company.object.get(pk=comp)。我宁愿有一个这样做的视图,然后将查询集传递给 listProperty 等,并从该视图进行后续过滤。有意义吗?
    • 这确实有点道理,但你所需要的只是函数。 def getCompany(id): Company.objects.get(pk=id)、def getProperties(id): Company.objects.get(pk=id).property_set.all()、def getProperty(cid, pid): Company.objects.get(pk=cid).property_set.get(pk=pid)。做起来不难。或者您可能对此处基于类的视图继承感兴趣:docs.djangoproject.com/en/dev/ref/class-based-views。这就是您从视图(如公司等)继承东西的方式。除了阅读文档之外,没什么可说的了。
    • 谢谢!我只是想让我的代码干燥,因为我知道这是最佳实践,并且抽象将减少重复并在未来工作。我非常感谢增加的方向 - 将研究基于类的视图。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2011-02-12
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多