2014-03-28 8 views
0

Target 모델을 Revision 개체 (django-reversion)와 일대일 필드로 태그 지정하는 응용 프로그램에 Target 모델을 추가했습니다. 태그는 버전 세트의 객체에 따라 다르며 이러한 객체 중 하나에 태그가 필요한 경우 전체 버전에 태그를 설정해야합니다. django-south 데이터 마이그레이션을 사용하여 데이터베이스의 모든 Revision 개체를 반복하고 연결된 version_set의 각 개체를 확인하고 필요한 경우 태그를 설정합니다.데이터 유출 중에 모델을 사용할 수 없음

[... 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에 액세스 할 수 있습니다 :

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 

오류를 준다?

편집 다니엘에게 감사드립니다. 다음 코드에서 내가 통해 모든 모델에 액세스하려고 마이그레이션의 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 exist으로 라인 instance = model.objects.get(id=version.object_id_int)에 실패합니다.

답변

1

당신이 올바른 방향으로 날을 받고있다

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

을 시도 할 수 있습니다. 오류가 발생했습니다. "이 버전에서는 app 'reversion'의 모델 '버전'을 사용할 수 없습니다. 데이터 이전 인스턴스의 모델 속성에 '버전'을 추가했습니다 (http://stackoverflow.com/questions/19400149/django에서). -south-how-can-i-access-models-in-sub-packages-in-migrations)하지만 비슷한 문제가 있다고 생각합니다. version.object.get_tag() 호출은 항상 AttributeError를 발생시킵니다. version.object가 나타내는 객체를 사용할 수 없기 때문입니다. –