Django查询计数错误

时间:2016-11-23 16:31:37

标签: python django django-models django-queryset

我有一个模型(这里称为MyModel

MyModel.objects.filter(value__exact='').delete()

删除空白value的所有对象(value是带有blank=True的TextField)。 但是,当我这样做时,似乎消失了更多的对象,而不是我用

删除之前的计数
MyModel.objects.filter(value__exact='').count()

如果我使用循环计算空值MyOModel个对象,请使用

count = 0
for obj in MyModel.objects.iterator():
    if not obj.value or obj.value.strip() == '':
        count += 1

与上述数量相比,我只获得了很少的额外物品。

导致这种情况的原因是什么?

我检查了引用MyModel的相关模型,如果它们可以级​​联并以某种方式删除MyModel的实例而没有空值。事实并非如此。

我在Django 1.8.7上。

更新

为了增加神秘主义,我现在试图在for循环中删除:

count = 0
for attribute_value in AttributeValue.objects.filter(value__exact=''):
    attribute_value.delete()
    count += 1

count变量带有预期的已删除MyModel个对象数,但仍然

MyModel.objects.filter(value__exact='').count()

的数字低于预期。事实上,似乎删除了预期对象数量的三倍以上。

我还尝试了以下计数(见评论)

MyModel.objects.filter(value='').count()
MyModel.objects.filter(value=u'').count()

计数结果相同。

2 个答案:

答案 0 :(得分:0)

这会对您的问题进行排序

from django.db.models.functions import Length

获取包含某些内容的所有值字段

MyModel.objects.annotate(value_length=Length('value')).filter(value_length=0)

获取所有非空值

MyModel.objects.annotate(value_length =长度( '值'))。过滤器(value_length__gt = 0)

您也可以这样做

MyModel.objects.filter(value='',value__isnull=True)

答案 1 :(得分:0)

我发现另一个模型的罪魁祸首是MyModel。我没有看到那里的原因是我的设置中的这个模型也是MyModel的引用,并且PyCharm以某种方式错过了关系(或者我在PyCharm GUI中做过)。刚出现的新版PyCharm现在为我修复了它。

很抱歉这个混乱。