2016-11-23 2 views
2

У меня есть модель (так называемый 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() 

с аналогичными результатами для подсчета.

+2

Обратите внимание, что число, возвращаемое Django после удаления, - это количество объектов ** и ** связанных объектов, которые были удалены. Возможно, это вас смущает. – lucasnadalutti

+1

Запросы проверяют на пустую строку. Это не автоматическое разделение пробелов от значения строки. – knbk

+0

'if not obj.value или obj.value.strip() == ''' Это также включает строки, содержащие только пробелы, а также 'None', если это возможно. –

ответ

0

Это сортирует ваши проблемы

from django.db.models.functions import Length 

Чтобы получить все поля значений, которые содержат что-то

MyModel.objects.annotate(value_length=Length('value')).filter(value_length=0) 

Чтобы получить все значения, которые не являются нуль

MyModel.objects.annotate (value_length = Length ('value')). filter (value_length__gt = 0)

Y НУ может также сделать этот путь

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

Ваш первый вариант кажется сложным. Что касается вашего второго варианта, 'значение' не является нулевым, и вам нужно использовать объекты' Q' для выдачи логических 'или'. – beruic

0

я нашел виновника в другой модели с незаметной чуждого MyModel. Причина, по которой я не смотрел, заключалась в том, что эта модель в моей настройке также относится к MyModel, а PyCharm каким-то образом упустила отношение (или я сделал это в GUI PyCharm).Новая версия PyCharm, которая только что появилась, теперь исправила ее для меня.

Извините за путаницу.

 Смежные вопросы

  • Нет связанных вопросов^_^