继承我的模特
class Game(models.Model):
...
moves = Moves()
class Moves():
moves = []
...
创建大约50个Game对象后,所有对象都指向相同的Moves()对象。我需要为每个对象提供不同的Move实例。
以下是游戏对象及其ID以及移动:
1 : <games.models.Moves object at 0x9f1474c>
2 : <games.models.Moves object at 0x9f1474c>
3 : <games.models.Moves object at 0x9f1474c>
...
答案 0 :(得分:1)
问题是Game.moves
和Moves.moves
都是类属性而不是实例属性。这意味着它们仅在创建类时初始化,而不是在创建实例时初始化。要使用__init__
方法获得所需的行为:
class Game(models.Model):
def __init__(self):
self.moves = Moves()
class Moves():
def __init__(self):
self.moves = []
以下是我从交互式Python解释器获得的内容:
>>> class Game(models.Model):
... def __init__(self):
... self.moves = Moves()
...
>>> class Moves():
... def __init__(self):
... self.moves = []
...
>>> Game().moves
<__main__.Moves instance at 0x7f4ee1b9f560>
>>> Game().moves
<__main__.Moves instance at 0x7f4ee1b9f680>
>>> Game().moves
<__main__.Moves instance at 0x7f4ee1b9f560>
您不能简单地创建其他实例属性,例如Django将Field
子类定义为Model
子类的类属性。
Django为metaclass
提供Model
,它扫描类属性并将它们转换为实例属性,但前提是它们是Field
的子类。