【问题标题】:(For all instances of) Django model field 'moves', it maps to the same Move class instance(对于所有实例)Django 模型字段“moves”,它映射到同一个 Move 类实例
【发布时间】:2014-05-24 11:51:13
【问题描述】:

这是我的模型

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

【问题讨论】:

  • Moves 不是此代码中ModelField 的子类。你知道如何创建自定义模型字段吗?为什么你需要它?你的问题不清楚,而且相当复杂docs.djangoproject.com/en/dev/howto/custom-model-fields。我们可以为您提供帮助,但您必须提供更多详细信息。

标签: python django model field


【解决方案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 为Model 提供了一个metaclass,它扫描类属性并将它们转换为实例属性,但前提是它们是Field 的子类。

【讨论】:

  • 引发错误。 'GameAdmin.list_display[5], 'moves' 不是 'GameAdmin' 的可调用属性或属性,也不是在模型 'Game' 中找到的。'
  • @Ryan 我看不到您的其余代码,而且我不是向导。在您的代码类中,Moves 不是ModelField 的子类,因此不要期望它的行为类似于模型字段。我只能告诉你,我的代码是获取 50 个 Moves 类实例的正确方法,而不是在 50 个 Game 类实例之间共享 1 个实例。那是你的问题。我可以帮助您前进,但是对于这个问题,只能说。
  • 错误来自您的代码 - 我的答案中没有看到任何 GameAdmin.list_display[5]。我可以怀疑你的admin.py 中有那行,但我无法继续猜测你的代码的其余部分是什么以及你想要实现的目标。
  • 成功了。显然,当我需要使用“对象”时,我的 Moves 类是从模型继承而来的。是的,我知道自定义字段,但在这种情况下我不需要它。我只需要 Move 类成为一个普通的 Python 类。
猜你喜欢
  • 2011-04-19
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多