Сохранение поля данных django в другое поле той же таблицы
Добавляю + 10 к (поле session) и пытаюсь сохранить данные в (поле totalsession), чтобы totalsession отображался в таблице во фронтенде в новом сыром виде при каждом нажатии на кнопку. СПАСИБО
VIEWS.PY
@api_view(['POST'])
def swimmersReduce(request, pk):
sw = get_object_or_404(Swimmers,id=pk) # gets just one record
current_sessions = sw.sessions + 10
sw.sessions = current_sessions # updates just the one in memory field for sw (for the one record)
sw.save() # you may want to do this to commit the new value
serializer = SubSerializer(instance=sw, data=request.data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False, status=status.HTTP_201_CREATED)
return JsonResponse(data=serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
MODELS.PY
class Swimmers(models.Model):
name = models.CharField(max_length=200, blank=False)
lastname = models.CharField(max_length=200, blank=False)
idno = models.CharField(max_length=200, blank=False, null=True)
sessions = models.IntegerField(blank=False)
totalsessions = models.IntegerField(blank=True, null=True)
dateofpayment = models.CharField(max_length=200, blank=True)
Воспринимая ваш вопрос буквально, вы можете просто установить totalsessions
равным sw.sessions
и сохранить объект снова.
Однако я не могу не задаться вопросом, отслеживаете ли вы в этой таблице общее количество сеансов по всем пловцам? То есть у одного пловца может быть 10 занятий, но вы отслеживаете, скажем, 100 занятий по всем пловцам, но в каждом объекте пловца. Это не лучший способ структурирования ваших моделей. Вам следует использовать агрегацию ORM Django, если вы хотите управлять общим количеством сессий:
total_sessions = Swimmers.objects.aggregate(Sum('sessions'))
result: {'sessions__sum': 240}
https://docs.djangoproject.com/en/4.0/topics/db/aggregation/
Если вы действительно хотите хранить это в базе данных, тогда я бы предложил другую модель, которая отслеживает эти числа в одном объекте, а не все вместе.
Кстати, ваше соглашение об именовании моделей должно быть Swimmer
, а не множественное число Swimmers
Редактировать
Чтобы лучше управлять занятиями по плаванию, создайте модель, подобную этой, с внешним ключом swimmer.
class SwimmingSession(models.Model):
swimmer = models.ForeignKey(Swimmer, ...)
# your other fields here, date, etc.
https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/
При создании сеанса плавания можно указать, к какому пловцу он относится. Каждый пловец может иметь любое количество сеансов плавания, чтобы получить количество сеансов плавания для каждого пловца, вы можете просто сделать:
swimmer = Swimmer.objects.get(pk=pk) # get a swimmer
total_sessions = swimmer.swimmingsession_set.count()
Чтобы получить общее количество занятий для всех пловцов, выполните следующие действия:
total_sessions = SwimmingSession.objects.count()