Django:使用对象作为字典键是否合理?

8

在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.>]}

这是昨天我提出的关于将None用作字典键的问题的后续。

4个回答

13

可变对象不应该作为字典键使用。尽管如此,这个方法有效是因为基础模型类根据模型的主键定义了__hash__,并且主键不太可能改变。但我仍然更喜欢直接使用主键作为键。


这是否就像 def __hash__(self): return self.id 一样简单?如果是这样,为什么需要明确说明呢?或者你的意思是我应该将我的字典定义为 {subject.id:[standard.id]} 吗? - japhyr
这个与Alexandru的回答有相同的想法,但更具体一些。 - japhyr

3
取决于您想如何使用它们。但是我建议采用更简单的方法:
字典的键可以是模型的主键。

-1

如果这些对象实现了一个良好的散列函数,我认为使用对象作为键是没有问题的,但这仅代表我的个人观点。


-1

最好使用字符串表示,因为当您需要进行查找时,您将需要编写所有这些内容,这将是一种痛苦,而且如果将来您想要更改Unicode表示方式,则必须找到一种重写旧的Unicode以进行查找的方法。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接