【发布时间】:2017-04-07 18:28:14
【问题描述】:
我有一个模型(这里称为 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()
结果比预期的要少。事实上,删除的对象数量似乎是预期的三倍以上。
我还尝试了以下计数(参见 cmets)
MyModel.objects.filter(value='').count()
MyModel.objects.filter(value=u'').count()
计数结果相同。
【问题讨论】:
-
请注意,删除后 Django 返回的数字是被删除的对象和相关对象的计数。也许这就是让您感到困惑的原因。
-
查询检查空字符串。它不会自动从行值中去除空格。
-
if not obj.value or obj.value.strip() == ''这还包括仅包含空格的字符串以及None,如果可能的话。 -
请提供minimal reproducible example。在不知道您的实际数据的情况下,很难知道这里发生了什么。
-
@lucasnadalutti 我检查了删除操作前后
MyModel.objects.count()的差异;)
标签: python django django-models django-queryset