Skip to main content
 首页 » 编程设计

python之django抽象模型继承导入

2025年05月04日26kenshinobiy

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

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

如何导入抽象模型?

请您参考如下方法:

稍微简化类的名称,以下对我有用 在 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 start{app,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'>