Django:如何在应用程序中创建多个字段

时间:2013-11-04 15:43:52

标签: python django django-models many-to-many django-orm

我试图扩展auth.models组以获得一些额外的字段。这是我在myapp.models.py中所做的:

class ProfileGroupBase(type):
    def __new__(cls, name, bases, attrs):
        module = attrs.pop('__module__')
        parents = [b for b in bases if isinstance(b, ProfileGroupBase)]
        if parents:
            fields = []
            for obj_name, obj in attrs.items():
                if isinstance(obj, models.Field): fields.append(obj_name)
                Group.add_to_class(obj_name, obj)
        return super(ProfileGroupBase, cls).__new__(cls, name, bases, attrs)

class ProfileGroup(object):
    __metaclass__ = ProfileGroupBase

class MyGroup(ProfileGroup):
    mobile = models.CharField(max_length = 15)
    email = models.CharField(max_length = 15)

使用这些代码,移动和电子邮件字段将添加到管理页面上的组中。现在我想添加另一个manytomany字段,所以我在MyGroup(ProfileGroup)类下添加了它:

  annotations = models.ManyToManyField(Annotation, verbose_name=_('annotation'), blank=True)

然后我在相同的models.py文件下创建了一个新模型Annotation:

class Annotation(models.Model):
    index = models.IntegerField()
    name = models.CharField(max_length = 100)

然而,出现错误:未定义名称“注释”。我想知道甚至类MyGroup和类Annotation都是在相同的models.py下定义的,它们实际上是分开的。我很困惑,有谁知道这里发生了什么?感谢。

2 个答案:

答案 0 :(得分:1)

在定义ForeignKey或ManyToManyField时,您应该使用包含应用程序名称和模型名称而不是实际类的字符串来定义另一个类。这样做


annotations = models.ManyToManyField('myapp.Annotation', 
 verbose_name=_('annotation'), blank=True)

这有助于引用尚未定义的模型,但也有循环引用。所以我建议一直这样做。另请查看foreignkey文档:https://docs.djangoproject.com/en/1.5/ref/models/fields/#foreignkey

答案 1 :(得分:0)

让我猜一下,你在前一个模型之后定义了Annotation模型,你有多对多关系。

class Annotation(models.Model):
    index = models.IntegerField()
    name = models.CharField(max_length = 100)

只需剪切Annotation模型的代码,然后将其粘贴到其他模型之前。