Django Manager.values() returns 一个神秘的 None

Django Manager.values() returns a mysterious None

Django 1.7.1,MySQL5.6,Python2.7.8

我有一个 class Test 有几千个成员对象。它仅从具体的基础 class 继承时间、日期和 ID。测试 class 包含一个对应于非空列的属性。我们称它为 color。当我 运行

Test.objects.filter(date=date).values('color').distinct()

它尽职地return是一个单例字典列表,看起来像

[{'color': None}, {'color': u'yellow'}, {'color': u'clear'}, ... ]

的确如此,

>>> Test.objects.filter(date=date).count()
1650
>>> Test.objects.filter(date=date, color=None).count()
1650
>>> Test.objects.filter(date=date, color='clear').count()
4

这些 return 值似乎相互矛盾,因为在给定日期的 1650 个对象中,所有对象都具有颜色 None,但其中 4 个具有颜色 'clear' .其他颜色 return 良好的 int 值,并且对数据库的检查确认它们是正确的并且该列中根本没有 Nones。

None 的存在在其他地方给我带来了麻烦,当程序迭代这些值并得到 KeyError 时。

  • values() 是否以某种方式简单地包含了 None,即使它既不是任何对象的实际值,甚至不可能?
  • 为什么 None 在那里?
  • 我能做些什么来避免它?

  • 如果日期是外键(根据评论),这可能是您问题的根源。

    我希望基础查询首先在此关系的 "one" 端进行过滤,其中一些记录在 "many" 端不匹配。那些不匹配的记录是您初始结果集的一部分,因此您会得到 None 一些行的颜色。

    有点乱,但是你可以这样排除那些不匹配的记录:

    Test.objects.filter(date=date).exclude(color=None).values('color').distinct()
    

    或者也许是时候重新审视您的模型设计了。很难从这里知道。