使用站点应用程序扩展 Django 以提供当前工作的应用程序作为 SAAS
Extending Django with sites app to provide current working app as SAAS
我在生产环境中部署了一个工作部署的 Django 应用程序,其中一些用户和各种对象存储在数据库中。客户告诉我网站是否可以复制,更改一些小的东西,例如模板、徽标等,但保留一些用户和对象。
我很久以前就听说过 django.contrib.sites
,所以在阅读描述后,它似乎是完美的选择。我直接动手,将 django.contrib.sites
添加到 INSTALLED_APPS
,将 SITE_ID
放入我的 settings.py
,然后执行迁移。
我选择对站点使用 ManyToManyField
,因为用户可能能够登录一个或多个站点:
sites = models.ManyToManyField(Site)
因为我修改了某些模型的管理器,例如 User
,我不得不覆盖我的自定义 get_queryset
,仅 return 当前网站用户,所以我添加了filter(sites=settings.SITE_ID)
到 returned 查询集,正如我在文档中看到的那样:
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
查询集为空),我无法使用任何用户登录。
因此,我已经返回,恢复了迁移(考虑到管理器的修改),现在我处于初始状态,在任何站点修改之前。
我一直在努力寻找有关如何处理此问题的文档,但我还没有找到有关如何在已有数据的情况下为站点执行此 "initial" 数据迁移的教程或一些良好做法数据库。
我的猜测是我必须执行站点迁移,然后将当前(也是唯一的)工作站点分配给所有数据(用户和相关对象),然后更改管理器和 运行管理人员迁移。是吗?还是我遗漏了什么?
任何帮助或见解将不胜感激。
如果我没有理解错的话,听起来问题在于通过您的更改,用户现在必须绑定到至少一个站点才能登录。由于您当前的用户未与任何网站相关联,因此会产生登录问题。
如果是这种情况,我建议添加一个data migration after the schema migrations in your branch. This data migration would loop through all of the users and add settings.SITE_ID
to user.sites
. You will also want to create a function that does the opposite, removes the entry from user.sites
in case you need to rollback, as described here。
我在生产环境中部署了一个工作部署的 Django 应用程序,其中一些用户和各种对象存储在数据库中。客户告诉我网站是否可以复制,更改一些小的东西,例如模板、徽标等,但保留一些用户和对象。
我很久以前就听说过 django.contrib.sites
,所以在阅读描述后,它似乎是完美的选择。我直接动手,将 django.contrib.sites
添加到 INSTALLED_APPS
,将 SITE_ID
放入我的 settings.py
,然后执行迁移。
我选择对站点使用 ManyToManyField
,因为用户可能能够登录一个或多个站点:
sites = models.ManyToManyField(Site)
因为我修改了某些模型的管理器,例如 User
,我不得不覆盖我的自定义 get_queryset
,仅 return 当前网站用户,所以我添加了filter(sites=settings.SITE_ID)
到 returned 查询集,正如我在文档中看到的那样:
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
查询集为空),我无法使用任何用户登录。
因此,我已经返回,恢复了迁移(考虑到管理器的修改),现在我处于初始状态,在任何站点修改之前。
我一直在努力寻找有关如何处理此问题的文档,但我还没有找到有关如何在已有数据的情况下为站点执行此 "initial" 数据迁移的教程或一些良好做法数据库。
我的猜测是我必须执行站点迁移,然后将当前(也是唯一的)工作站点分配给所有数据(用户和相关对象),然后更改管理器和 运行管理人员迁移。是吗?还是我遗漏了什么?
任何帮助或见解将不胜感激。
如果我没有理解错的话,听起来问题在于通过您的更改,用户现在必须绑定到至少一个站点才能登录。由于您当前的用户未与任何网站相关联,因此会产生登录问题。
如果是这种情况,我建议添加一个data migration after the schema migrations in your branch. This data migration would loop through all of the users and add settings.SITE_ID
to user.sites
. You will also want to create a function that does the opposite, removes the entry from user.sites
in case you need to rollback, as described here。