2014-03-28 20 views
0

我在我的應用中添加了一個Target模型,該模型通過一對一字段標記Revision對象(從django-reversion)。標籤取決於版本集中的對象,如果這些對象中的任何一個需要標籤,則應該爲整個版本設置標籤。我試圖使用django-south數據遷移遍歷數據庫中所有的Revision對象,檢查關聯的version_set中的每個對象,並在必要時設置標記。模型在數據遷移期間不可用

class Migration(DataMigration): 

    def forwards(self, orm): 
     for revision in orm["reversion.Revision"].objects.all(): 
      try: 
       revision.target # the revision is already tagged 
      except: # revision.target raises different sorts of DoesNotExist errors, 
        # and I can't work out how to catch all of them 
       for version in revision.version_set.all(): 
        try: 
         tag = version.object.get_tag() # all models in my app that 
         orm.Target.objects.create( # specify tags have this method 
           revision=revision, 
           tag=tag) 
         break 
        except AttributeError: # the version set doesn't contain any 
         pass    # models that specify a tag 

的給出了一個錯誤:

[... lots of stuff cut ...], line 21, in forwards 
    for version in revision.version_set.all(): 
AttributeError: 'Revision' object has no attribute 'version_set' 

我怎樣才能在不同的應用程序一個datamigration期間獲得訪問Revision對象version_set

編輯感謝丹尼爾我進一步。在下面的代碼我嘗試通過訪問所有車型遷移自己的orm

def forwards(self, orm): 
    my_models = { # models with a .get_tag() method 
      "modela": orm.ModelA, 
      "modelb": orm.ModelB, 
      } 
    for revision in orm["reversion.Revision"].objects.all(): 
     for version in orm["reversion.Version"].objects.filter(revision=revision): 
      try: 
       model = my_models[version.content_type.model] 
       instance = model.objects.get(id=version.object_id) 
       tag = instance.get_tag() 
       orm.RevisionTargetLanguage.objects.create(
         revision=revision, 
         tag=tag) 
       break 
      except KeyError: # not one of the models with a .get_tag() method 
       pass 

這種失敗在與例外DoesNotExist: ModelB matching query does not existinstance = model.objects.get(id=version.object_id_int)

回答

1

你可以嘗試

orm['reversion.Version'].objects.filter(revision=revision) 
+0

這讓我在正確的方向。我收到了一個錯誤:「應用程序」reversion「中的'model'版本在此遷移中不可用。我向數據遷移實例的models屬性添加了'version'(來自http://stackoverflow.com/questions/19400149/django -south-how-can-i-access-models-in-sub-packages-in-migrations),但是我想我有一個類似的問題:version.object.get_tag()調用總是引發一個AttributeError - 推測因爲由version.object表示的對象不可用。 –