2017-07-15 57 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

相关问题