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 值,并且对数据库的检查确认它们是正确的并且该列中根本没有 None
s。
None
的存在在其他地方给我带来了麻烦,当程序迭代这些值并得到 KeyError 时。
values()
是否以某种方式简单地包含了 None
,即使它既不是任何对象的实际值,甚至不可能?
为什么 None
在那里?
我能做些什么来避免它?
如果日期是外键(根据评论),这可能是您问题的根源。
我希望基础查询首先在此关系的 "one" 端进行过滤,其中一些记录在 "many" 端不匹配。那些不匹配的记录是您初始结果集的一部分,因此您会得到 None 一些行的颜色。
有点乱,但是你可以这样排除那些不匹配的记录:
Test.objects.filter(date=date).exclude(color=None).values('color').distinct()
或者也许是时候重新审视您的模型设计了。很难从这里知道。
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 值,并且对数据库的检查确认它们是正确的并且该列中根本没有 None
s。
None
的存在在其他地方给我带来了麻烦,当程序迭代这些值并得到 KeyError 时。
values()
是否以某种方式简单地包含了 None
,即使它既不是任何对象的实际值,甚至不可能?
None
在那里?
如果日期是外键(根据评论),这可能是您问题的根源。
我希望基础查询首先在此关系的 "one" 端进行过滤,其中一些记录在 "many" 端不匹配。那些不匹配的记录是您初始结果集的一部分,因此您会得到 None 一些行的颜色。
有点乱,但是你可以这样排除那些不匹配的记录:
Test.objects.filter(date=date).exclude(color=None).values('color').distinct()
或者也许是时候重新审视您的模型设计了。很难从这里知道。