как сложить два вводимых значения на django rest
Проблема
Доброго времени суток, я делаю простое финансовое приложение на Django Rest(Для себя). Приложение должно считать затраты за опр.время, и проблема в том что данные вводятся и изменяются на те которые я изменил: например у меня на балансе 1000 руб я перевожу другу 600 руб и на балансе должно остаться 400,но при вводе баланс остаётся таким каким был и ничего не спишется и сумма перевода останется прежней даже если сумма перевода превысит баланс.
Так вот
Я попытался написать простую логику из if и else в сериалайзере, но дошёл только до того,что я принимаю не вводимые данные в эти поля а сами эти поля.(закоментированный код в serialiser.py)
Пожалуста
Пожалуйста хотябы подскажите где найти документацию где говорится как работать с водимыми данными в Django Rest.
models.py
from django.db import models
from django.db import transaction
import random
# from django.contrib.auth import get_user_model
# User = get_user_model()
# Create your models here.
class Wolf(models.Model):
Trans_TYPE = (
('income', 'Income'),
('withdrawal of funds', 'Withdrawal of funds')
)
# user = models.ForeignKey(User, verbose_name='User', on_delete=models.CASCADE)
first_name = models.CharField(verbose_name='First Name', max_length=30, blank=True)
last_name = models.CharField(verbose_name='Second Name', max_length=30, blank=True)
email = models.CharField(verbose_name='email', unique=True, max_length=100, blank=True)
balance = models.DecimalField(verbose_name='balance', default=0, max_digits=12, decimal_places=2)
transaction = models.CharField(max_length=30, verbose_name='Transaction', choices=Trans_TYPE)
amount = models.DecimalField(verbose_name='amount', max_digits=12, decimal_places=2)
date = models.DateTimeField(auto_now_add=True)
Trans_from = models.CharField(verbose_name='From / To whom', max_length=100, blank=True)
serialisers.py
from rest_framework import serializers
from .models import Wolf
class WolfListSerializer(serializers.ModelSerializer):
class Meta:
model = Wolf
fields = '__all__'
class WolfSerializer(serializers.ModelSerializer):
class Meta:
model = Wolf
fields = '__all__'
class WolfTranSerializer(serializers.ModelSerializer):
class Meta:
model = Wolf
fields = ['id', 'first_name', 'balance', 'transaction', 'amount']
# Bal = fields[2]
# Amon = fields[4]
# Trns = fields[3]
#
# int(Bal)
# int(Amon)
#
# def make_transaction(self, Bal, Amon, Trns):
# if Bal < Amon:
# raise (ValueError('Not enough money'))
# else:
# if Trns == 'Withdrawal of funds':
# Bal -= Amon
# else:
# Bal += Amon
# Wolf.balance == Bal
# Wolf.balance.save()
Ответы (1 шт):
serializer это не то место, где должна быть эта логика.
Роль serializer-а, превратить объекти в форму пригодную для отправки их по сети или хранения в файле. Проверка же, условий допустима ли операция, это бизнес-логика, или по другому логика предметной области.
В простых случаях ее можно поместить в класс модели:
class Wolf(models.Model):
...
def make_transaction(self, value, ... другие параметры):
# тут логика
if value > self.balance:
raise NotEnoughMoney()
self.balance -= value
Роль view будет получить параметры из запроса, прочитать модель, вызвать метод с бизнес логикой и сохранить результат. Вот схематичный код:
def perform_transaction(request):
# сначала нужно получить параметры из запроса
wolf_id = requst.get('wolf_id')
amount = request.get('amount')
wolf = Wolf.objects.get(id=wolf_id)
try:
wolf.make_transaction(amount, ...)
wolf.save()
except NotEnoughMoney:
# возвращаем страницу с ошибкой