Изменение значения определенных ключей в базе данных 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,
    })
Вернуться на верх