我似乎无法弄清楚如何将两个类相互导入。在运行应用程序时,它只是说
from room import Room
ImportError: cannot import name Room
这可能是一个设计问题,但我认为没有其他方法可以引用这两个类,所以这需要保持原样。需要导入的唯一原因是因为对象中的redisco模块需要它们(它们需要知道类型)
#Room class.
class Room(models.Model):
from player import Player
players = models.ListField(Player, required = True)
#Player class
class Player(models.Model):
from room import Room
room = models.ReferenceField(Room, required = True)
如何让它发挥作用?
E:
框架是Redisco(Redis)
答案 0 :(得分:2)
大多数ORM模型支持反向引用(其中引用字段的目标模型被赋予指向引用对象的额外属性),和/或允许您通过其他方式指定关系。
Redisco没有我可以发现的反向引用,但 支持字符串引用。如果传入字符串,它将被解释为模型名称,与__name__
属性匹配:
class Room(models.Model):
players = models.ListField('Player', required = True)
这完全绕过了导入问题。
target_type - 可以是Python对象或redisco模型类。
如果target_type不是redisco模型类,则target_type应该是 也是一个可以将list元素的(字符串)值转换为的callable TARGET_TYPE。例如。 str,unicode,int,float。
ListField还接受引用redisco模型的字符串。
code to resolve the name使用函数get_model_from_key()
来解析字符串,该字符串只搜索models.Model
的所有子类,在__name__
上匹配。
在验证新值或第一次检索现有值时,它将解析名称,此时Player
子类已被导入。
答案 1 :(得分:1)
如果它们在同一个.py文件中,那么您不需要导入。如果它们位于同一目录中的不同文件中,则只需使用“导入室”(假设它位于名为“room.py”的文件中)。如果它们位于不同目录中的单独文件中,则需要使用imp模块。
import imp
roomClass = imp.load_source('roomClass', [Path to room.py])
然后可以通过以下方式调用它:
aRoom = roomClass.Room(Model)
答案 2 :(得分:0)
首先,如果要将模块导入程序,它们必须位于同一目录中。
按照此操作导入模块;
from filename import classname
您要导入类
的 filename = your .py文件class 是您要使用的特定类。
或强>
from filename import *
将添加所有函数和类。
同时检查此主题。 program is running fine but cannot being import with IndexError
答案 3 :(得分:-1)