Django:模型继承:FK和M2M

3
我正在尝试做这个: 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 assert not to.meta.abstract,"%s cannot define a relation with abstract class %s" % (self.class._name__, to._meta.object_name) AssertionError: ForeignKey不能定义与抽象类OtherModel的关系。
请给予建议...如果您有任何问题或不理解我所解释的内容,请告诉我。由于我正在处理的文件非常复杂,因此我不想发布整个文件,因为我知道它在这个关系上出现了错误。
2个回答

2

你不能使用一个抽象模型建立关联,但这正是你正在尝试做的(使用ManyToManyFieldOtherModel)。如果你想要让这个工作起来,你需要从OtherModel中移除abstract = True并将common添加到你的INSTALLED_APPS

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


这正是我所想的,但我不明白的是文档让我觉得我可以有这个关系。我做错了还是文档错了? - jackiekazil
我不知道你到底指的是文档中的哪个主题,但我认为定义与抽象模型之间的关系是没有意义的。 - Bernhard Vallant

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

这对我来说是个悲伤的消息。确实是悲伤的消息。我希望我的不幸能为别人带来好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接