Python Django查询计数错误

Python Django查询计数错误,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我有一个模型(在这里称为MyModel) MyModel.objects.filter(value__exact='').delete() 删除值为空的所有对象(值为空的文本字段)。 然而,当我这样做的时候,消失的对象似乎比我删除之前得到的数量还要多 MyModel.objects.filter(value__exact='').count() 如果我使用循环计算空值myodel对象,则使用 count = 0 for obj in MyModel.objects.iterator():

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

MyModel.objects.filter(value__exact='').delete()
删除值为空的所有对象(值为空的文本字段)。 然而,当我这样做的时候,消失的对象似乎比我删除之前得到的数量还要多

MyModel.objects.filter(value__exact='').count()
如果我使用循环计算空值
myodel
对象,则使用

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()
出来的数字比预期的要少。事实上,似乎删除的对象数是预期的三倍多

我还尝试了以下计数方法(见注释)


计数的结果相同。

这将对您的问题进行排序

from django.db.models.functions import Length
获取包含某些内容的所有值字段

MyModel.objects.annotate(value_length=Length('value')).filter(value_length=0)
获取所有非空值

MyModel.objects.annotate(value\u length=length('value')).filter(value\u length\u gt=0)

你也可以这样做

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

我在另一个模型中发现了罪犯,该模型与
MyModel
有一个未被注意到的外来项。我没有查看的原因是,我的设置中的这个模型也是由
MyModel
引用的,而PyCharm不知何故错过了这个关系(或者我在PyCharm GUI中错过了)。刚刚发布的PyCharm新版本现在为我修复了它


抱歉造成混淆。

请注意,Django在删除后返回的数字是已删除的对象和相关对象的计数。也许这就是让你困惑的地方。查询检查是否有空字符串。它不会自动从行值中删除空格。
如果不是obj.value或obj.value.strip()==''
这还包括仅包含空格的字符串以及
,如果可能的话。请提供一个。在不知道实际数据的情况下,很难知道这里发生了什么。@lucasnadalutti我检查了删除操作前后
MyModel.objects.count()
上的差异;)你的第一个选择似乎过于复杂了。关于第二个选项,
value
不可为空,您需要使用
Q
对象来发出逻辑
MyModel.objects.filter(value='',value__isnull=True)