Django 1.2 South 0.7 以及 django-annoying 的 AutoOneToOneField 导致 TypeError:'LegacyConnection' 对象不可迭代

2024-04-26 09:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是django1.2trunk和south0.7,以及从Django复制的AutoOneToOneField。South抱怨说,该字段没有定义规则,新版本的South不再具有自动字段类型解析器。因此,我阅读了South文档并编写了以下定义(基本上是OneToOneField规则的一个精确副本):

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提出了以下错误。在

^{pr2}$

这和django1.2trunk最近的变化有关吗?我怎么解决这个问题?在

我使用此字段如下:

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

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))

Tags: toinstancenameselfobjdefaultfieldget
3条回答

试着改变这条线

(AutoOneToOneField),

为此:

^{pr2}$

像您那样声明的元组是不可读取的。在

你的规则有简单的python相关问题。。在元组中,如果只有一个项目在里面,则必须添加逗号。在

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

但说实话,我不知道我可以用字段内的方法代替规则。我将应用你的补丁并提交到django恼人的存储库。在

通过删除规则并将以下方法添加到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)

相关问题 更多 >