【问题标题】:Django: Model Inheritance: FK & M2MDjango:模型继承:FK & M2M
【发布时间】:2010-10-18 00:04:04
【问题描述】:

我想这样做: 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

我安装了“应用程序”,但没有安装“通用”。如果没有 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 的关系

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

【问题讨论】:

    标签: django inheritance django-models data-modeling


    【解决方案1】:

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

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

    【讨论】:

    • 这就是我的想法,但我不明白的是文档给我的印象是我可以拥有这种关系。是我做错了还是文档错了?
    • 我不知道您具体指的是文档中的哪个主题,但我认为定义与抽象模型的关系没有任何意义......
    【解决方案2】:

    我发现了问题.....

    这会起作用:

    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 cannot define a relationship with abstract class 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
    

    这对我来说是个悲伤的消息。确实是个悲伤的消息。我希望我的悲伤消息对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2015-09-29
      • 2015-03-05
      相关资源
      最近更新 更多