使用网站应用扩展Django以提供当前工作应用作为SAAS

时间:2017-08-09 15:35:58

标签: python django django-contrib

我在生产中部署了一个有效的Django应用程序,其中一些用户和各种对象存储在数据库中。客户告诉我,网站是否可以复制,更改一些小的东西,如模板,徽标等,但维护一些用户和对象。

我很久以前就听说过django.contrib.sites,所以在阅读完描述之后,它似乎是完美的选择。我直接动手,将django.contrib.sites添加到INSTALLED_APPS,将SITE_ID放入我的settings.py,然后执行迁移。

我选择为网站使用ManyToManyField,因为用户可能可以在一个或多个网站中登录:

sites = models.ManyToManyField(Site)

由于我修改了某些模型的管理员,例如User,我不得不覆盖我的自定义get_queryset,只返回当前网站用户,因此我添加了filter(sites=settings.SITE_ID)返回的查询集,正如我在文档中看到的那样:

from django.contrib.auth.models import BaseUserManager

class UserManager(BaseUserManager):

    def get_queryset(self):
        return super(UserManager, self).get_queryset().filter(
            is_active=True).filter(sites=settings.SITE_ID)

对于其他类,由于我没有覆盖默认管理器,我只是覆盖了objects

objects = CurrentSiteManager()

在我尝试测试当前正在运行的应用程序之前,一切正常。由于数据库中的对象没有关联的站点(User.sites查询集为空),我无法使用任何用户登录。

因此,我已经退回,恢复迁移(考虑到管理员的修改),现在我处于初始状态,在任何网站修改之前。

我一直在尝试查找有关如何处理此问题的文档,但是当数据库中已存在数据时,我还没有找到关于如何为站点执行此“初始”数据迁移的教程或一些良好实践。 / p>

我的猜测是我必须执行网站迁移,然后将当前(且唯​​一的)工作网站分配给所有数据(用户和相关对象),然后更改管理器并运行管理器迁移。是吗?或者我错过了什么?

非常感谢任何帮助或见解。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,听起来问题就是你的改变,用户现在必须绑定到至少一个站点才能登录。由于您当前的用户未与任何网站相关联,因此会产生登录问题。

如果是这种情况,我建议在分支中的架构迁移后添加data migration。此数据迁移将遍历所有用户,并将settings.SITE_ID添加到user.sites。您还需要创建一个相反的函数,如果需要回滚,则从user.sites中删除条目,如here所述。