【问题标题】:How can I tell django 1.7 to put migration into specific folder我如何告诉 django 1.7 将迁移放入特定文件夹
【发布时间】:2014-12-12 13:17:23
【问题描述】:

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

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

然后我找到了这个答案:How do I extend the Django Group model? where guy 建议使用field.contribute_to_class() 方法。

我已将此调整放在 中模型定义的正上方。 (不要问我为什么需要组角色,这不是我的主意,我只需要它们: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目录下创建一个迁移文件,而是在里面创建或者只是输出迁移代码?

【问题讨论】:

  • 对于这种特殊情况,另一种可能的解决方案似乎是在角色端的 Group 和 Role 之间定义 m2m。这样,将为角色创建迁移,并将反向关系自动添加到组中。

标签: python django django-models django-migrations


【解决方案1】:

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

您可以创建一个专用包,以免与您的迁移冲突 埃斯。

MIGRATION_MODULES = {
     'django.contrib.auth' : 'myapp.auth_migrations',
     'myapp': 'myapp.migrations'  # this line is only to clarify. IT'S NOT NEEDED AT ALL 
}

【讨论】:

  • 是的,你是对的,我必须将所有现有的迁移从 'auth' 复制到我的新应用程序中,并且...它们会与应用程序自己的迁移发生冲突 :( 但无论如何,我明天会尝试对此做些什么。感谢您的回答!
【解决方案2】:

我之前没有看到field.contribute_to_class()上课解决这个问题。

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

您可以返回并使用与 Group, 的 1:1 关系或从 Group 继承。

您说您不能更改所有需要的对 Group 的引用?缺少什么?

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

【讨论】:

  • 我遇到的第一个继承问题是我必须更改 User.groups 关系以指向我的新组。 Django 不允许在继承的模型中重新定义字段(我必须重新定义 AbstractUser.groups),我不得不复制很多基本模型来修改一个字段。但后来似乎称为“组”的反向关系在某些地方是硬编码的,比如github.com/django/django/blob/master/django/contrib/auth/…。这实际上意味着我必须复制整个后端来修改它......然后与原始 django auth 保持不变的是什么?
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2017-08-02
  • 2015-10-31
  • 2014-05-28
  • 2015-02-09
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多