首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django1.2+ South 0.7 + Django -恼人的AutoOneToOneField导致TypeError:'LegacyConnection‘对象不可迭代

Django1.2+ South 0.7 + Django -恼人的AutoOneToOneField导致TypeError:'LegacyConnection‘对象不可迭代
EN

Stack Overflow用户
提问于 2010-05-06 20:52:45
回答 3查看 1.2K关注 0票数 4

我使用的是Django1.2主干和South 0.7,还有一个从Django复制过来的AutoOneToOneField --很烦人。South抱怨说,字段没有定义规则,并且South的新版本不再具有自动字段类型解析器。因此,我阅读了南方文档,并编写了以下定义(基本上是OneToOneField规则的精确副本):

代码语言:javascript
运行
复制
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"]) 

现在,当我进行模式迁移时,South会引发以下错误。

代码语言:javascript
运行
复制
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 1.2主干最近的变化有关吗?我该如何解决这个问题?

我按如下方式使用此字段:

代码语言:javascript
运行
复制
class Bar(models.Model):
    foo = AutoOneToOneField("foo.Foo", primary_key=True, related_name="bar")

参考django-tagging中的字段代码:

代码语言:javascript
运行
复制
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))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-06 21:32:27

尝试更改此行

代码语言:javascript
运行
复制
(AutoOneToOneField),

要这样做:

代码语言:javascript
运行
复制
(AutoOneToOneField,),

像你这样声明的元组是不可迭代的。

票数 5
EN

Stack Overflow用户

发布于 2010-05-06 21:14:11

通过移除规则并在AutoOneToOneField中添加以下方法,解决了此问题:

代码语言:javascript
运行
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2010-05-06 21:32:40

您的规则有简单的python相关问题..在元组中,如果其中只有一项,则必须添加逗号。

因此将(AutoOneToOneField)更改为(AutoOneToOneField,),

但老实说,我不知道我可以在字段中使用方法而不是规则。我将应用您的补丁并提交到django- apply存储库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2781210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档