django抽象模型继承导入

Posted

技术标签:

【中文标题】django抽象模型继承导入【英文标题】:django abstract model inheritance import 【发布时间】:2013-12-22 18:25:42 【问题描述】:

我想知道如何将抽象模型导入另一个应用程序

world_elements 持有:

class Location(models.Model):
    """
    Holds x,y coordinates of a virtual 2d map. 
    """

    x = models.IntegerField()
    y = models.IntegerField()

    class Meta:
        abstract = True

    def __unicode__(self):
        return "%s, %s" % (self.x, self.y)

现在我在另一个应用程序中尝试:

from world_elements.models import Location

class NpcTown(Location):
    """
    A town with their coordinates trianinggrounds quest office and all other relevant attributes
    """

    # general town information
    name = models.CharField(max_length = 63)
    flavor = models.TextField(max_length = 511)
    guild = models.ForeignKey(NpcGuild)

    # locations
    trainingground = models.ForeignKey(TrainingGround, null=True)

    def __unicode__(self):
        return self.name

但现在我得到 ImportError: cannot import name Location

如何导入抽象模型?

【问题讨论】:

如果模型在world_elements,为什么要从world_elements.models导入? 请发布您的项目文件结构 对不起,如果不清楚,我的另一个模型在角色应用程序中,或者在 wons 应用程序中 【参考方案1】:

稍微简化一下类的名称,以下对我有用 在 Django 1.7 中,这是当时最新的稳定版本 写作。

目录布局

    project
          \_ apps
              \_ __init__.py
              \_ A
              \_ B
          \_ config
              \_ __init__.py
              \_ settings.py
              \_ urls.py
              \_ wsgi.py
          \_ data
          \_ makefile
          \_ manage.py
          \_ README.md

在上面,app A 包含抽象模型。 B 使用它,作为 如下:

抽象类

class AModel(Model):
    ...
    class Meta:
        abstract = True

然后

具体类

from apps.A.models import AModel

class BModel(AModel):
    ...
    blah = "ayyo"

请注意,应用程序 A 和 B 都必须包含 __init__.py 文件。

不要害怕打破 Django 目录布局约定 由manage.py startapp,project 强加。这样做会解放你的思想 你会喜欢把事情整理得井井有条。

另一个有助于调试模块导入的东西就是printing 导入的模块。然后你就可以知道实际正在解决什么问题。 例如:

from apps.A.models import AModel
print AModel # <class 'apps.A.models.AModel'>

还有:

import apps
print apps # <module 'apps' from '/home/g33k/gits/checkouts/my/project/apps/__init__.pyc'>

【讨论】:

老兄,你成就了我的一天。我已经为这个进口问题苦苦挣扎了很长一段时间。是的,我应该重新制作我的文件夹结构。这个问题很老了,我实际上已经忘记了。到目前为止,我找到了一种解决方法(我讨厌)来解决这个问题。伙计,你这个男人 小更新也许适合你。还将 init.py 文件也添加到设置映射中 没问题 :) 是的,我在设置目录中添加了 __init__.py - 它在我的设置中,我只是忘了包含它。 刚刚遇到另一个导入错误:( from apps.heroes.models import Hero。现在我确定该类存在但是当我尝试同步db时,我得到文件“/home/ikke/panda/Buah/ apps/heroes/models.py",第 4 行,在 中(一个模型从英雄导入城镇,另一个从城镇导入英雄......) from apps.towns.models import Town File "/home/ikke/panda/Buah /apps/towns/models.py",第 4 行,在 from apps.heroes.models import Hero 我又要循环导入了吗? 现在我想我可以通过使用 import apps.heroes.models as app_heroes 然后使用 app_heroes.Hero 来解决这个问题,但它找不到我的模型文件(我有一个 init 在应用程序地图中以及在自己的应用程序地图中)【参考方案2】:

在这样的正常结构中:

my_project
  - /my_project
    - /settings.py
  - /app1
    - /models.py
      * class Model1...
  - /app2
    - /models.py
      * class Model2...

从 app1/models.py 这对我有用:

from django.db import models
from my_project.app1.models import Model1

class Model2(Model1):
    ...

使用 Django 11.1

【讨论】:

【参考方案3】:

试试

from world_elements import Location

【讨论】:

然后我得到下一个错误:ImportError: cannot import name Location

以上是关于django抽象模型继承导入的主要内容,如果未能解决你的问题,请参考以下文章

不能使用继承的 Django 模型的 Meta 类来配置在继承的抽象模型中定义的字段

Python / Django中多个抽象模型继承中的字段菱形模式

Django:从带有元的抽象类的多重继承

具有未继承约束的 Django 模型抽象模型:“约束”指的是字段“xxx”,它不是模型“Foo”的本地字段

Django模型层Meta内部类详解

在 django 中获取继承的模型对象