(对于Django模型字段'move'的所有实例),它映射到相同的Move类实例

时间:2014-04-10 16:26:17

标签: python django model field

继承我的模特

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>
...

1 个答案:

答案 0 :(得分:1)

问题是Game.movesMoves.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的子类。