2017-07-15 73 views
1

當創建Transaction時,我需要自動更新我的Account的金額。如何在創建另一個模型後更新相關模型?

我有Transaction模型model.py

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

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) 

而其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? 

我想創建將內執行的自定義方法條件如果serializer是有效的,這將通過他們的id獲得帳戶和類別。到目前爲止,我可以顯示它們的當前值,例如amountname,但在此之後,我不知道該怎麼做。我想象着我需要使用我的AccountSerializer,但我不確定。

+0

您是否嘗試過account.save()? –

回答

0

最簡單的方法是重寫您Transaction模型save方法:

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 

詳見Django documentation

+1

謝謝,它工作很好。 – mfgabriel92

相關問題