【问题标题】:Django: Is it reasonable to use objects as dictionary keys?Django:使用对象作为字典键是否合理?
【发布时间】:2011-10-25 22:21:51
【问题描述】:

在 django 中使用对象作为字典的键是否合理?我已经这样做了,并且有效。但我想知道这是否是最佳做法,或者它是否会带来我现在无法预见的困难。

我正在从事一个涉及教育标准的项目。我的字典结构类似于{Subject:[Standards]}。主题的模型如下所示:

class Subject(models.Model):
  subject = models.CharField(max_length=255, unique=True)

  def __unicode__(self):
    return self.subject

可以使用此模型中的对象作为我的字典的键,还是应该使用字符串表示,例如 Subject.subject?

如果是这样,unicode 方法会影响这个吗?当我尝试使用 Subject.subject 作为键时,我得到了类似 {u'Math': [<Subject: Students can perform calculations.>]} 使用对象作为键的东西,它看起来像 {<Subject: Math>: [<Standard: Students can perform calculations.>]}

这是我昨天提出的关于 using None as a dictionary key 的问题的后续。

【问题讨论】:

    标签: python django dictionary key


    【解决方案1】:

    可变对象不应该真正用作字典键。也就是说,这是因为基础模型类根据模型的主键定义了__hash__,这不太可能改变。但是我更喜欢直接使用pk作为key。

    【讨论】:

    • 就这么简单def __hash__(self): return self.id?如果是这样,为什么需要明确说明?或者你的意思是我应该将我的字典定义为{subject.id:[standard.id]}
    • 这与 Alexandru 的回应的想法相同,但更具体一些。
    【解决方案2】:

    这取决于您想如何使用它们。不过,我建议使用更简单的方法:

    字典的键可以是模型的主键。

    【讨论】:

      【解决方案3】:

      假设对象实现了一个好的哈希函数,我会说使用对象作为键没有错,但这只是我个人的看法。

      【讨论】:

        【解决方案4】:

        最好使用字符串表示,因为当您需要进行查找时,您需要写出所有这些内容,这将是一件很痛苦的事情,而且如果您将来想要更改您的 unicode 表示将不得不找到一种重写旧 unicode 的方法来进行查找。

        祝你好运。

        【讨论】:

          猜你喜欢
          • 2016-05-04
          • 2011-10-25
          • 1970-01-01
          • 2021-12-17
          • 2012-08-31
          • 2014-05-01
          • 2015-07-07
          • 1970-01-01
          • 2011-10-09
          相关资源
          最近更新 更多