我遇到了一个非常有趣的情况。
我需要用一些字段扩展默认的 django 组模型。 我首先尝试使用继承,例如继承自 Group 模型并更改一些引用,但似乎我无法更改所有需要的引用,因此,这种方式完全破坏了 django 权限系统。
然后我找到了这个答案:How do I extend the Django Group model?家伙建议在哪里使用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>它为组模型生成迁移,但试图将其放入 django.contrib.auth 应用程序,这绝对不是我需要的。
所以,我的问题是:
有没有办法告诉django 为Group 模型生成迁移,而不是在python libs 目录下创建迁移文件,而是在< myapp > 中创建它或者只输出迁移代码?
请您参考如下方法:
django 查找迁移的位置 cn 可以使用 MIGRATION_MODULES 自定义在您的 settings.py 中,无论如何,这意味着所有迁移(不仅是新迁移)都必须存在。 升级Django时需要复制原来的migrations手动更新
您可以创建专用包,以免与您的迁移发生冲突 Es.
MIGRATION_MODULES = {
'django.contrib.auth' : 'myapp.auth_migrations',
'myapp': 'myapp.migrations' # this line is only to clarify. IT'S NOT NEEDED AT ALL
}
