2010-05-06 6 views
4

나는 0.7과 AutoOneToOneField를 django-annoying에서 복사하여 장고 1.2 트렁크를 사용하고 있습니다. 남쪽은 필드에 규칙이 정의되어 있지 않으며 새로운 버전의 South에는 더 이상 자동 필드 유형 파서가 없다고 불평했습니다. 그래서 남쪽 문서를 읽고 다음과 같이 정의합니다 (OneToOneField 규칙 기본적으로 정확한 사본) 작성 : 나는 schemamigration을 수행 할 때Django 1.2 + South 0.7 + django-annoying의 AutoOneToOneField는 TypeError로 연결됩니다. 'LegacyConnection'객체는 반복 가능하지 않습니다.

rules = [ 
    (
    (AutoOneToOneField), 
    [], 
    { 
     "to": ["rel.to", {}], 
     "to_field": ["rel.field_name", {"default_attr": "rel.to._meta.pk.name"}], 
     "related_name": ["rel.related_name", {"default": None}], 
     "db_index": ["db_index", {"default": True}], 
    }, 
) 
] 
from south.modelsinspector import add_introspection_rules 
add_introspection_rules(rules, ["^myapp"]) 

지금 한국은 다음과 같은 오류가 발생합니다.

Traceback (most recent call last): 
    File "manage.py", line 11, in <module> 
    execute_manager(settings) 
    File "django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "django/core/management/base.py", line 196, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "django/core/management/base.py", line 223, in execute 
    output = self.handle(*args, **options) 
    File "South-0.7-py2.6.egg/south/management/commands/schemamigration.py", line 92, in handle 
    (k, v) for k, v in freezer.freeze_apps([migrations.app_label()]).items() 
    File "South-0.7-py2.6.egg/south/creator/freezer.py", line 33, in freeze_apps 
    model_defs[model_key(model)] = prep_for_freeze(model) 
    File "South-0.7-py2.6.egg/south/creator/freezer.py", line 65, in prep_for_freeze 
    fields = modelsinspector.get_model_fields(model, m2m=True) 
    File "South-0.7-py2.6.egg/south/modelsinspector.py", line 322, in get_model_fields 
    args, kwargs = introspector(field) 
    File "South-0.7-py2.6.egg/south/modelsinspector.py", line 271, in introspector 
    arg_defs, kwarg_defs = matching_details(field) 
    File "South-0.7-py2.6.egg/south/modelsinspector.py", line 187, in matching_details 
    if any([isinstance(field, x) for x in classes]): 
TypeError: 'LegacyConnection' object is not iterable 

이것은 장고 1.2 트렁크의 최근 변경 사항과 관련이 있습니까? 이 문제를 어떻게 해결할 수 있습니까? 참고로

class Bar(models.Model): 
    foo = AutoOneToOneField("foo.Foo", primary_key=True, related_name="bar") 

에서 필드 코드 장고 태그 :

class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor): 
    def __get__(self, instance, instance_type=None): 
     try: 
      return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type) 
     except self.related.model.DoesNotExist: 
      obj = self.related.model(**{self.related.field.name: instance}) 
      obj.save() 
      return obj 

class AutoOneToOneField(OneToOneField): 
    def contribute_to_related_class(self, cls, related): 
     setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related)) 

답변

5

이 줄을 변경하십시오.

이에
(AutoOneToOneField), 

: 당신이했던 것처럼 튜플 선언

(AutoOneToOneField,), 

은 반복 가능한 없습니다.

+1

흠, 나는이 어리석은 실수를 완전히 놓쳤습니다 ... 감사합니다! – konrad

3

규칙을 제거하고 AutoOneToOneField에 다음 메서드를 추가하여 문제를 해결 다음과 같이

나는이 필드를 사용 :

def south_field_triple(self): 
    "Returns a suitable description of this field for South." 
    from south.modelsinspector import introspector 
    field_class = OneToOneField.__module__ + "." + OneToOneField.__name__ 
    args, kwargs = introspector(self) 
    return (field_class, args, kwargs) 
1

귀하의 규칙은 간단한 파이썬 관련 문제가 있습니다. 튜플의 경우, 내부에 단일 항목 만있는 경우 쉼표를 추가해야합니다.

그래서

(AutoOneToOneField)에, (AutoOneToOneField)를 변경하지만 솔직히 말해서, 내가 필드 대신 규칙 내에서 방법을 사용할 수 있다는 것을 알고하지 않았다. 나는 당신의 패치를 적용하고 장고 성가신 저장소에 제출할 것이다.

+0

감사합니다. – konrad

관련 문제