2

我遇到了非常有趣的情况。

我需要用一些字段扩展默认 django 的 Group 模型。我尝试先使用继承,例如从 Group 模型继承并更改一些引用,但似乎我无法更改所有需要的引用,因此,这种方式完全破坏了 django 权限系统。

然后我找到了这个答案:如何扩展 Django Group 模型?家伙建议使用field.contribute_to_class()方法的地方。

我已将此调整放在 <myapp> 中模型定义的正上方。(不要问我为什么需要组角色,这不是我的主意,我只需要它们:D)

if not hasattr(Group, 'roles'):
    field = models.ManyToManyField(
        Role, verbose_name=_('roles'), blank=True,
        help_text=_('List of roles attached to this group'),
           related_name='groups')
    field.contribute_to_class(Group, 'roles')


class MyGroup(Group):

    class Meta:
        proxy = True

    def _sync_permissions(self):
        """
            This method will sync group permissions with all attached Roles.
        """
        self.permissions.clear()
        for role in self.roles.all():
            self.permissions.add(role.permissions)
        self.save()

这部分似乎正在工作(它确实修改了 django.contrib.auth.models.Group 模型)

但接下来我需要为 Group 模型生成迁移。如果我只是简单地运行./manage.py makemigrations <myapp>它会为 Group 模型生成一个迁移,但尝试将它放在 django.contrib.auth 应用程序中,那绝对不是我需要的。

所以,我的问题是:

有没有办法告诉 django 为 Group 模型生成迁移,而不是在 python libs 目录下创建迁移文件,而是在 <myapp> 中创建它或者只是输出迁移代码?

4

2 回答 2

3

django 查找迁移的位置可以在您的 settings.py 中使用MIGRATION_MODULES进行自定义,无论如何这意味着所有迁移(不仅是新迁移)必须在那里。升级 Django 时需要复制原始迁移并手动更新它们

您可以创建一个专用包,以免与迁移 Es 发生冲突。

MIGRATION_MODULES = {
     'django.contrib.auth' : 'myapp.auth_migrations',
     'myapp': 'myapp.migrations'  # this line is only to clarify. IT'S NOT NEEDED AT ALL 
}
于 2014-12-12T14:43:54.603 回答
0

我以前没有见过field.contribute_to_class()解决这个问题的类解决方案。

对我来说,它看起来有点脏,就像猴子补丁一样。

您将返回并使用 1:1 关系Group,或继承自Group.

你说你不能改变所有需要的对 Group 的引用?什么不见​​了?

我知道这不是您问题的答案,但可能是您问题的解决方案:-)

于 2014-12-12T15:54:19.893 回答