Django .save() восстанавливается

#python #mysql #django #save

#python #mysql #django #Сохранить

Вопрос:

У меня есть поле InteferField, установленное в моделях, называемое статусом. У меня есть метод, который в два раза переключает значения статусов двух строк.

 Row one -> status = 1
Row two -> status = 2
  

Теперь, я полагаю, если я переключу статус первой строки на какой-то недостижимый reach (99) Я мог бы использовать это в качестве посредника для переключения второй строки, а затем переключить первую строку.

 Get status = 1 -> Row one
Get status = 2 -> Row two
Set Row one -> status = 99
Save Row one
Set Row two -> status = 1
Save Row two
Get status = 99 -> Row one
Set Row one -> status = 2
Save Row one
  

Странная вещь в том, что данные восстанавливаются. Если я просто изменю статус первой строки на 99, он изменится на 99, а затем, мгновение спустя, вернется к своему исходному значению. Мы не уверены, почему это происходит, но оказывается, что из этого вообще ничего не получается.

 original = 1
swap = 2

originalCase = Case.objects.get(queue_num = original)
#swapCase = Case.objects.get(queue_num = swap)
originalCase.queue_num = 99
originalCase.save()
#swapCase.queue_num = original
#swapCase.save()
#originalCase = Case.objects.get(queue_num = 99)
#originalCase.queue_num = swap
#originalCase.save()
return HttpResponse(Case.objects.filter(queue_num__gt=0).order_by('queue_num'))
  

Это потому, что мы запрашиваем fast, и он не обновляется вовремя для следующего обновления? Или в моей логике есть недостаток?

Ответ №1:

Хммм… Не следует ли следующее:

 originalCase = Case.objects.get(queue_num = swap)
  

Будь это:

 originalCase = Case.objects.get(queue_num = 99)
  

Если вы скопировали и вставили этот код как есть, это ваша проблема. По сути, вы извлекаете тот, который вы только что изменили, и меняете его обратно.

Обновить:

Упрощение вашего кода также может помочь устранить проблему. Технически вам не нужен заполнитель подкачки. Поскольку запрос попадает в базу данных только один раз при первоначальной выборке всех объектов, вы могли бы сделать что-то вроде следующего:

 cases = Case.objects.all()
for case in cases:
    if case.queue_num == original:
        case.queue_num = swap
    elif case.queue_num == swap:
        case.queue_num = original

    case.save()
  

Или, если вы хотите сохранить ту же идею, вы могли бы даже сделать следующее (что на самом деле может быть проще):

 Case.objects.filter(queue_num=original).update(queue_num=99)
Case.objects.filter(queue_num=swap).update(queue_num=original)
Case.objects.filter(queue_num=99).update(queue_num=swap)
  

Комментарии:

1. Упс, извините, это тот код, который у нас есть. Но я также запустил только отредактированный код, и он все равно возвращается.

2. Я думаю, что вашему коду нужно больше контекста. Основываясь на том, что вы опубликовали, это больше не должно быть «возвратом».

3. Именно поэтому мы в замешательстве. Мы запускаем только эту единственную функцию. Это полная функция там. Мы выполняем запрос, и все. Вкладка остается открытой. Но после HttpResponse ничего не должно происходить.

4. Мы устранили проблему. На самом деле это сводилось к проблеме с urls.py . Root также вызывал другую функцию, которую мы не собирались вызывать. У нас было (r’^ $’,’index’) выше этой функции, таким образом, вызывая метод сброса. Спасибо за помощь и за рекомендованный более простой код.

Ответ №2:

строка 2,3,4 снизу не имеет никакого эффекта:

 originalCase = Case.objects.get(queue_num = swap)
originalCase.queue_num = swap
originalCase.save()
  

Комментарии:

1. Извините, это была ошибка. Изначально было queue_num = 99, НО даже когда я запускаю отредактированный код, он все равно возвращается.