Django South迁移无法访问自定义模型Meta属性

时间:2013-05-17 21:03:15

标签: django django-south django-guardian

我有一个我创建的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',)

问题是,我正在尝试在南方进行数据迁移以创建许多新模型实例,并且它不会分配对象级权限,因为自定义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'

因此,出于某种原因,Meta在迁移时未使用我的自定义user_permissions_to_add属性进行更新。我怎样才能确保它在迁移中的Meta上存在?

1 个答案:

答案 0 :(得分:1)

南方的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已记录的其他Meta字段