Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过sites应用程序扩展Django,以SAAS的形式提供当前的工作应用程序_Python_Django_Django Contrib - Fatal编程技术网

Python 通过sites应用程序扩展Django,以SAAS的形式提供当前的工作应用程序

Python 通过sites应用程序扩展Django,以SAAS的形式提供当前的工作应用程序,python,django,django-contrib,Python,Django,Django Contrib,我在生产环境中有一个工作部署的Django应用程序,数据库中存储了一些用户和各种对象。客户告诉我,如果网站可以被复制,改变一些小东西,如模板、徽标等,但要维护一些用户和对象 我很久以前就听说过django.contrib.sites,所以在阅读了描述之后,它似乎是一个完美的选择。我直接动手,将django.contrib.sites添加到已安装的应用程序中,将站点ID放入我的设置.py,并执行迁移 我选择对站点使用ManyToManyField,因为用户可以登录一个或多个站点: sites =

我在生产环境中有一个工作部署的Django应用程序,数据库中存储了一些用户和各种对象。客户告诉我,如果网站可以被复制,改变一些小东西,如模板、徽标等,但要维护一些用户和对象

我很久以前就听说过django.contrib.sites,所以在阅读了描述之后,它似乎是一个完美的选择。我直接动手,将
django.contrib.sites
添加到
已安装的应用程序中,将
站点ID
放入我的
设置.py
,并执行迁移

我选择对站点使用
ManyToManyField
,因为用户可以登录一个或多个站点:

sites = models.ManyToManyField(Site)
由于我修改了一些模型的管理器,如
用户
,我必须覆盖我的自定义
获取查询集
,以仅返回当前站点用户,因此我向返回的查询集添加了
过滤器(sites=settings.site\u 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 = CurrentSiteManager()
在我尝试测试我当前的工作应用程序之前,一切都很正常。由于数据库中的对象没有关联的站点(
User.sites
queryset为空),因此我无法使用任何用户登录

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

我一直在寻找如何实现这一点的文档,但还没有找到如何在数据库中已有数据的情况下为站点执行这种“初始”数据迁移的教程或一些良好实践

我的猜测是,我必须执行站点迁移,然后将当前(也是唯一)工作站点分配给所有数据(用户和相关对象),然后更改管理器并运行管理器迁移。是这样吗?还是我遗漏了什么


任何帮助或见解都将不胜感激。

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


如果是这种情况,我建议在分支中的模式迁移之后添加一个。此数据迁移将在所有用户中循环,并将
设置.SITE\u ID
添加到
用户.sites
。您还需要创建一个与此相反的函数,从
user.sites
中删除条目,以防需要回滚,如前所述。

Nice,非常感谢。我就是这么做的,而且成功了。只是一个简单的问题:实现回滚真的是强制性的吗?我的猜测是,如果我需要返回,因为模型迁移会删除站点模型,引用会消失,因此,对象会被删除,对吗?我不是肯定的,但在尝试删除时,它实际上可能会创建外键错误,因为您正试图删除数据库中对象引用的模型。更重要的是,IMHO为所有数据迁移创建回滚只是一种良好的做法。无论如何,我绝对同意这种良好做法。谢谢你的提示!