我有一个我创建的 Django 应用程序,它使用 Django Guardian 来管理对象级权限,并使用 Django South 来管理迁移。我创建了一个模型 mixin,它允许模型使用自定义 Meta 属性定义要在创建时分配的对象级权限。例如,一个Message
模型可能看起来像:
class Message(AutoUserPermissionsMixin, models.Model):
sender = models.ForeignKey(User)
recipient = models.ForeignKey(User)
text = models.TextField(blank=True)
class Meta:
permissions = (
('view_message', 'Can view message'),
('respond_to_message', 'Can respond to message'),
)
user_permissions_to_add = {
'recipient' : ('view_message', 'respond_to_message',),
'sender' : ('view_message',)
}
AutoUserPermissionsMixin
定义了一个自定义,save()
它读取模型的 Meta 以了解应该将哪些对象级权限分配给来自 的哪个字段user_permissions_to_add
,并进行分配。我通过在我定义的文件顶部执行此操作添加了自定义 Meta 字段AutoUserPermissionsMixin
:
from django.db import models
models.options.DEFAULT_NAMES += ('user_permissions_to_add',)
问题是,我正在尝试在 South 进行数据迁移以创建许多新模型实例,并且它没有分配对象级权限,因为save()
在迁移中不处理自定义方法。
现在我可以使用自定义中使用的相同方法save()
来尝试在模型中应用权限,即sync_object_permissions(instance, permissions)
. 我想在迁移时读取它们在 Meta 上的任何状态的权限,而不是将它们硬编码到迁移中。但是,当尝试调用时sync_object_permissions(message_instance, permissions=message_instance._meta.user_permissions_to_add)
,South 会抛出错误:
AttributeError: 'Options' object has no attribute 'user_permissions_to_add'
user_permissions_to_add
因此,由于某种原因,在迁移时Meta 没有使用我的自定义属性进行更新。我如何确保它在迁移中的 Meta 上存在?