Django:模型继承:FK& M2M

时间:2010-10-18 00:04:05

标签: django inheritance django-models data-modeling

我试图这样做: http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

使用此款式

这被保存为common / abstract.py

class OtherModel(models.Model):

   something = Charfield(max_length=100)

   class Meta:
            abstract = True

class Base(models.Model):
        fk_model = models.ForeignKey(OtherModel, related_name="%(app_label)s_%(class)s_related")

        class Meta:
            abstract = True

然后我将其导入另一个文件。我们称之为app / models.py

from common.abstract import Base

class ChildB(Base):
    pass

我已经安装了'app'而不是'common'。它会在没有FK或M2M关系的情况下很好地导入,但是当我尝试添加它时,我收到此错误:

/lib/python2.6/site-packages/django/db/models/fields/related.py“,第808行, init     声明不要。 meta.abstract,“%s无法定义与抽象类%s的关系”%(self。 class _name__,to._meta.object_name) AssertionError:ForeignKey无法定义与抽象类OtherModel

的关系

请告知....如果您有任何疑问或不理解我正在解释的内容,也请告诉我。我使用的文件非常复杂,因此我不想发布整个文件,因为我知道它正在破坏这一关系。

2 个答案:

答案 0 :(得分:2)

您不能与抽象模型建立关系,但这是您尝试做的事情(ManyToManyFieldOtherModel)。如果您想要完成这项工作,则需要从abstract = True移除OtherModel并将common添加到INSTALLED_APPS

如果要与OtherModel的子类中的Base的不同子类相关联,则需要在子类上定义关系,而不是在抽象模型上定义!

答案 1 :(得分:1)

我想出了问题.....

这样可行:

from django.db import models

class CommonInfo(models.Model):

    name = models.CharField(max_length=100)

class Base(models.Model):
    m2m = models.ForeignKey(CommonInfo, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class ChildA(Base):
    pass

这会给你错误:AssertionError:ForeignKey无法定义与抽象类OtherModel 的关系。这是因为你不能在指向另一个抽象的抽象上有FK关系或M2M关系类。

from django.db import models

class CommonInfo(models.Model):
    class Meta:
        abstract = True

    name = models.CharField(max_length=100)

class Base(models.Model):
    m2m = models.ForeignKey(CommonInfo, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class ChildA(Base):
    pass

这对我来说是个悲伤的消息。确实是悲伤的消息我希望我的伤心新闻能让别人受益。