Почему я не могу увеличить models.IntegerField?

Я хочу иметь поле счетчика в моей модели профиля пользователя, чтобы видеть, сколько запросов сделал каждый пользователь.

Однако я не могу понять, как увеличить счетчик.

Я пытаюсь увеличить целочисленное поле, которое связано с моделью, которая выглядит следующим образом:

class Profile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    request_count = models.IntegerField(default=0)

Затем в моих представлениях я хочу увеличивать request_count каждый раз, когда пользователь делает запрос, следующим образом:

     user = User.objects.get(email=pk)
     user_profile = Profile.objects.get(user=user)
     user_profile.request_count += 1
     user_profile.save()

По какой-то причине каждый раз, когда я запускаю это, он устанавливает request_count равным 1.

Я предполагаю, что это происходит потому, что по умолчанию устанавливается значение 0 (значение по умолчанию, которое я установил), а затем к нему добавляется 1.

Но почему значение не увеличивается?

Помощь очень признательна.

Вы можете попробовать использовать выражения F

def updateProfile(request, pk):
     user = User.objects.get(email=pk)
     user_profile = Profile.objects.get(user=user)
     user_profile.request_count = F("request_count") + 1
     user_profile.save()

     return redirect('index')

Если вы хотите получить доступ к значению после этого, вы должны использовать refresh_from_db.

Единственное, что выглядит странно, это вот это:

user = User.objects.get(email=pk)

Если вы не используете пользовательскую модель пользователя, email не является первичным ключом. Единственными обязательными полями в стандартной модели пользователя являются имя пользователя и пароль. Так что, возможно, у него проблемы с поиском пользователя.

Если дело не в этом, возможно, вы можете попробовать обновить это поле специально:

user_profile.save(update_fields=['request_count'])

В итоге выяснилось, что сохранение моей ModelForm по какой-то причине сбрасывало переменную count, хотя поле count не было частью формы модели. Исправить ситуацию можно было, изменив порядок действий: сначала установить экземпляр, затем сохранить форму, затем сохранить профиль с переменной count.

Окончательные решения выглядят следующим образом:

Def updateProfile(request, pk):
    user = User.objects.get(email=pk)if form.is_valid():
        try:
            user_profile = Profile.objects.get(user=user)
            user_profile.ai_count +=1
        except:
            user_profile = None
        profile = form.save(commit=False)
        profile.user = user
        profile.save()
        user_profile.save()
        return redirect('index')

Не совсем уверен, почему это работает, но это работает.

Вернуться на верх