Изменение значения определенных ключей в базе данных Django Dictionary не сохраняется
У меня есть словарь с несколькими ключами и значениями для них. У меня есть представление, где есть условие, если значение одного конкретного ключа существует равно тому же числу POST запрос для обновления только определенных других ключей вот запрос, чтобы получить лучшее представление:
<QuerySet [{'id': 87, 'active': False, '........': '.....', '......': '......', 'log_order': 1, 'lo
g_weight': 10.0, 'log_repetitions': 10, 'date': .....)}]
>
В моих представлениях я пытаюсь проверить, совпадает ли log_order с POST-запросом, отправленным пользователем, и если совпадает, то изменить значения lo g_weight и log_repetitions.
if active_session.log.values():
for i in active_session.log.values():
# print("i[log_order] is equal to:", i['log_order'])
existing = i['log_order']
new = data.log_order
print(i.values())
print(existing, new)
if int(existing) == int(new):
i['log_repetitions']=int(data.log_repetitions)
i['log_weight']=int(data.log_weight)
print(i['log_repetitions'])
print("Available in Session")
active_session.save()
print(active_session.log.values())
else:
active_session.log.add(data)
print('Log added to Session')
print(active_session.log.values())
вот пост, чтобы знать больше контекста:
if form.is_valid():
data = Log()
data.log_order = request.POST.get('log_order')
data.log_repetitions = form.cleaned_data['log_repetitions']
data.log_weight = form.cleaned_data['log_weight']
data.save() # save data to table
Я пробовал сохранять данные и update(), но ничего не меняет словарь, печатается тот же результат и новые данные не заменяют существующие. Моя цель - заменить и избежать дублирования.
Я попробовал и протестировал ваш код и обнаружил некоторые проблемы с ним. Ниже приведен фрагмент кода, который я протестировал и он работает.
Я не совсем уверен, для какой цели нужен этот код, но думаю, что вы можете найти метод update_or_create
полезным (также работает на связанных менеджерах, таких как ваш log
). Вот ссылка на Django docs.
def addlog(request, id):
if request.method == 'POST':
# Moved this part to the POST section of the view. It is sufficient to simplify
# the query in this way. Also, you probably want to check if there are sessions
# in the DB. Otherwise, the code would break. This returns a 404 in case there
# are absolutely no sessions.
active_session = ActiveSession.objects.last()
if active_session is None:
return Http404()
form = LogForm(request.POST)
if form.is_valid():
data = Log()
# Use form.cleaned_data instead of log_order. Form validates the data, POST dict doesn't.
data.log_order = form.cleaned_data['log_order']
# Ignored because it's missing from the model code
# data.log_repetitions = form.cleaned_data['log_repetitions']
# data.log_weight = form.cleaned_data['log_weight']
data.save()
# Use Django ORM querysets instead of values()
# See https://www.django-antipatterns.com/antipattern/over-use-of-values.html
active_session_logs = active_session.log.filter(log_order=data.log_order)
if active_session_logs.exists():
# Suggestion: try to use update() instead of a combination of delete & add.
# It reduces two SQL queries to one.
active_session_logs.delete()
active_session.log.add(data)
# After using RelatedManager.add(), no need to call save(), the changes
# are persisted in the DB simply by using add().
# Always redirect after successfully processing the form.
return redirect(reverse('test_73764999:add-log', args=(data.id,)))
else:
# If there are errors, re-render the same form with errors
return render(request, 'test_73764999/form.html', {
'form': form, 'id': id,
})
else:
# If this is a GET request, render an empty form
form = LogForm()
return render(request, 'test_73764999/form.html', {
'form': form, 'id': id,
})