2017-07-15 4 views
1

Ich muss meinen Account Betrag automatisch aktualisieren, wenn ein Transaction erstellt wird.Wie wird ein verwandtes Modell aktualisiert, nachdem ein anderes Modell erstellt wurde?

Ich habe Transaction Modell model.py:

class Transaction(models.Model): 
    user = models.ForeignKey(User, default=None) 
    account = models.ForeignKey(Account, default=None) 
    ... 

Seine serializers.py:

class TransactionSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Transaction 
     fields = ('id', 'user', 'account_id', 'category_id', 'name', 'amount', 'description', 'created_at') 

    def create(self, validated_data): 
     return Transaction.objects.create(**validated_data) 

Und seine views.py:

class TransactionList(APIView): 
    def get(self, request): 
     user_id = request.user.pk 
     transactions = Transaction.objects.filter(user_id=user_id).order_by('-created_at') 
     serializer = TransactionSerializer(transactions, many=True) 

     return Response(serializer.data) 

    def post(self, request): 
     account_id = request.data['account_id'] 
     category_id = request.data['category_id'] 
     serializer = TransactionSerializer(data=request.data) 

     if serializer.is_valid(): 
      serializer.save(user=request.user, account_id=account_id, category_id=category_id) 

      self.update_account(request) 

      return Response(serializer.data, status=HTTP_201_CREATED) 

     return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) 

    def update_account(self, request): 
     account_id = request.data['account_id'] 
     category_id = request.data['category_id'] 
     account = Account.objects.get(pk=account_id) 
     category = Category.objects.get(pk=category_id) 

     if category.type == 'expense': 
      account.amount = (account.amount - int(self.request['amount'])) 
     else: 
      account.amount = (account.amount + int(self.request['amount'])) 

     # Then what? 

Ich dachte an eine benutzerdefinierte Methode erstellen, die innerhalb ausgeführt wird die Bedingung, wenn serializer ist gültig, das würde das Konto und die Kategorie nach ihrer ID erhalten. Ich könnte, so weit, die aktuellen Werte anzeigen, die sie haben, wie amount und name, aber danach weiß ich nicht, was zu tun ist. Ich stelle mir vor, ich brauche meine AccountSerializer, aber ich bin mir nicht sicher.

+0

Haben Sie versucht, account.save()? –

Antwort

0

Der einfachste Weg wäre, die save Methode Ihres Transaction Modell außer Kraft zu setzen:

class Transaction(models.Model): 
    user = models.ForeignKey(User, default=None) 
    account = models.ForeignKey(Account, default=None) 
    ... 
    def save(self, force_insert=False, force_update=False, using=None, update_fields=None): 
     super(Transaction, self).save() 
     # Update self.account 

Siehe Django documentation für weitere Einzelheiten.

+1

Danke, es funktioniert gut. – mfgabriel92

Verwandte Themen