2013-05-17 78 views
2

我有一個我創建的Django應用程序,它使用Django Guardian來管理對象級權限,Django South來管理遷移。我創建了一個模型混合模型,它允許模型使用自定義的Meta屬性定義在創建時分配的對象級權限。因此,例如一個Message模型可能看起來像:Django South遷移無法訪問自定義模型元屬性

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()讀取模型的元知道哪些對象級權限應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)時,南引發錯誤:

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

所以,出於某種原因,元是不是被更新我的自定義user_permissions_to_add在遷移的時間屬性。我如何確保它在遷移中的Meta中存在?

回答

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然後向南將拋出一個異常在他們的多彩選擇,當處理不包括任何模型的my_special_field「

您可以通過south.modelsinspector.meta_details

看着其他字段檢查其他元字段南已記錄