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)