【问题标题】:Django South migration cannot access custom model Meta attributeDjango South 迁移无法访问自定义模型元属性
【发布时间】:2013-05-13 03:26:51
【问题描述】:

我创建了一个 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 中的哪个字段,并执行分配。我通过在我定义AutoUserPermissionsMixin的文件顶部执行此操作添加了自定义元字段:

from django.db import models
models.options.DEFAULT_NAMES += ('user_permissions_to_add',)

问题是,我正在尝试在 South 进行数据迁移以创建许多新模型实例,并且它没有分配对象级权限,因为自定义 save() 方法未在迁移。

现在我可以使用自定义save() 中使用的相同方法来尝试在模型中应用权限,即sync_object_permissions(instance, permissions)。我想在迁移时读取它们在 Meta 上的 whatever 状态的权限,而不是将它们硬编码到迁移中。但是,当尝试调用 sync_object_permissions(message_instance, permissions=message_instance._meta.user_permissions_to_add) 时,South 会抛出错误:

AttributeError: 'Options' object has no attribute 'user_permissions_to_add'

因此,由于某种原因,在迁移时 Meta 没有使用我的自定义 user_permissions_to_add 属性进行更新。如何确保它在迁移中的 Meta 上存在?

【问题讨论】:

    标签: django django-south django-guardian


    【解决方案1】:

    South 的 modelinspector 可以修改为在 Meta 上添加额外的字段,以便在迁移期间可以使用此字段。

    这是我使用的代码(将其放入您的 models.py 文件或它导入的其他文件中):

    #make South record the Meta field "my_special_field" in its orm freezes
    import south.modelsinspector as mi
    mi.meta_details['my_special_field'] = ['my_special_field', {'default': None, 'ignore_missing': True}]
    

    请注意,如果您不包含'ignore_missing': True,那么当 South 在处理其 Meta 选项中不包含“my_special_field”的任何模型时会抛出异常

    您可以通过查看 south.modelsinspector.meta_details 上的其他字段来检查 South 已经记录的其他元字段

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多