У меня есть модель (так называемый MyModel
здесь), где я делаюDjango Количество запросов неправильно
MyModel.objects.filter(value__exact='').delete()
удалить все объекты с пустой value
(value
является TextField с blank=True
). Однако там, кажется, исчезает больше объектов, когда я делаю это, чем граф я получаю перед удалением с
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.
UPDATE
Чтобы добавить к мистике я сейчас попытался удалить в цикле:
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()
с аналогичными результатами для подсчета.
Обратите внимание, что число, возвращаемое Django после удаления, - это количество объектов ** и ** связанных объектов, которые были удалены. Возможно, это вас смущает. – lucasnadalutti
Запросы проверяют на пустую строку. Это не автоматическое разделение пробелов от значения строки. – knbk
'if not obj.value или obj.value.strip() == ''' Это также включает строки, содержащие только пробелы, а также 'None', если это возможно. –