Django Manager.values()返回一个神秘的无

时间:2015-01-12 22:06:27

标签: python mysql django-admin nonetype

Django 1.7.1,MySQL 5.6,Python 2.7.8

我有一个包含几千个成员对象的类Test。它从具体的基类继承了时间,日期和id。 Test类包含与非可空列对应的属性。我们称之为color。我跑的时候

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

它尽职尽责地返回一个看起来像

的单例序列表
[{'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

这些返回值似乎与来自给定日期的1650个总对象相矛盾,所有这些对象都具有颜色None,但其中4个具有颜色' clear'。其他颜色也会返回良好的int值,并且对DB的检查确认它们是正确的,并且该列中根本没有None

当程序迭代值并获得KeyError时,None的存在会在其他地方引起麻烦。

  • values()是否以某种方式包含None,即使它既不是任何对象的真正价值,也不可能?
  • 为什么那里有None
  • 我可以做些什么来避免它?

  • 1 个答案:

    答案 0 :(得分:1)

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

    我希望底层查询首先在此关系的“一”侧进行过滤,其中一些记录在“多”方面是不匹配的。那些不匹配的记录是初始结果集的一部分,因此对于某些行的颜色,您将获得“无”。

    这有点像kludge,但你可以用这种方式排除那些不匹配的记录:

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

    或许是时候再看看你的模特设计了。很难从这里知道。