我有一个模型(这里称为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()
计数结果相同。
答案 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现在为我修复了它。
很抱歉这个混乱。