Почему я не могу увеличить 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')
Не совсем уверен, почему это работает, но это работает.