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)
에 실패합니다.
을 시도 할 수 있습니다. 오류가 발생했습니다. "이 버전에서는 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가 나타내는 객체를 사용할 수 없기 때문입니다. –