Python Django 1.2+;南部0.7+;django讨厌的';s AutoOneToOneField导致类型错误:';LegacyConnection';对象是不可编辑的
我正在使用Django 1.2主干和South 0.7以及从Django复制的AutoOneToOneField。South抱怨该字段没有定义规则,新版South不再具有自动字段类型解析器。因此,我阅读了南方的文档并编写了以下定义(基本上是OneToOneField规则的精确副本): 现在,当我进行模式迁移时,South会引发以下错误Python Django 1.2+;南部0.7+;django讨厌的';s AutoOneToOneField导致类型错误:';LegacyConnection';对象是不可编辑的,python,django,django-models,django-south,Python,Django,Django Models,Django South,我正在使用Django 1.2主干和South 0.7以及从Django复制的AutoOneToOneField。South抱怨该字段没有定义规则,新版South不再具有自动字段类型解析器。因此,我阅读了南方的文档并编写了以下定义(基本上是OneToOneField规则的精确副本): 现在,当我进行模式迁移时,South会引发以下错误 Traceback (most recent call last): File "manage.py", line 11, in <module>
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
参考django标签中的字段代码:
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))
通过删除规则并向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)
试着改变这一行
(AutoOneToOneField),
为此:
(AutoOneToOneField,),
像您这样声明的元组是不可编辑的。您的规则存在与python相关的简单问题。。在元组中,若其中只有一项,则必须添加逗号 因此,将(AutoOneToOneField)更改为(AutoOneToOneField,) 但老实说,我不知道我可以在字段内使用方法而不是规则。我将应用您的补丁并提交到django存储库
(AutoOneToOneField),
(AutoOneToOneField,),