如果在外部方法中执行事务,如何查看更新的模型对象

2024-05-14 21:51:52 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我遇到的情况:

user = User.objects.get(pk=1)
print 'Original Balance is %s' user.balance

### this commits the new balance in a transaction in another file/function
user.pay(1.05) # this function does a user.balance=new_balance;user.save()

print 'New Balance is %s' user.balance

以下是pay()方法:

def pay(self, amount):
    """
    Withdraw `amount` USD from this credit card.
    The user's balance goes UP!!!
    """
    user = self.user
    environment_url = braintree.Configuration.environment._Environment__server.lower()
    print '>>> MODE: %s| AMOUNT: %s' % (environment_url, amount)

    with transaction.commit_manually():
        try:
            sale = braintree.Transaction.sale({
                    "amount": "%.2f" % float(amount),
                    "customer_id": self.braintree_id,
                })
            if sale.is_success:
                user.balance = float(user.balance) + amount
                user.save()
                payment = Payment.objects.create(
                   user=user,
                   amount_in=amount,
                   status=PAID,
                   transaction_id=sale.transaction.id,
                   domain=braintree.Configuration.environment._Environment__server,
                   data = str(sale),
                   reason='Deposit via api of $%.2f' % amount)
                History.objects.create(user=self.user, history_type=HISTORY_TYPE_DEPOSIT, obj_class_name='Payment', obj_pk=payment.pk)
                transaction.commit()
                return sale

如何更新用户对象的值,而不是使用从第一个.get()中提取/缓存的值


Tags: inselfidobjectsenvironmentissalethis
2条回答
    user.balance = new_balance
    user.save()

应该这样做;)

您需要使用@transaction.commit_manually装饰器。阅读关于事务的Django docs 因此,您需要使用@transaction.commit_manuallydecorator将付费呼叫移动到一个视图

    @transaction.commit_manually
    def viewfunc(request):
        user = User.objects.get(pk=1)
        print 'Original Balance is %s' user.balance

        ### this commits the new balance in a transaction in another file/function
        user.pay(1.05)
        transaction.commit()
        print 'New Balance is %s' user.balance

然后,你的支付功能

    def pay(self, amount):
        """
        Withdraw `amount` USD from this credit card.
        The user's balance goes UP!!!
        """
        user = self.user
        environment_url = braintree.Configuration.environment._Environment__server.lower()
        print '>>> MODE: %s| AMOUNT: %s' % (environment_url, amount)


                sale = braintree.Transaction.sale({
                        "amount": "%.2f" % float(amount),
                        "customer_id": self.braintree_id,
                    })
                if sale.is_success:
                    user.balance = float(user.balance) + amount
                    user.save()
                    payment = Payment.objects.create(
                       user=user,
                       amount_in=amount,
                       status=PAID,
                       transaction_id=sale.transaction.id,
                       domain=braintree.Configuration.environment._Environment__server,
                       data = str(sale),
                       reason='Deposit via api of $%.2f' % amount)
                    History.objects.create(user=self.user, history_type=HISTORY_TYPE_DEPOSIT, obj_class_name='Payment', obj_pk=payment.pk)

                    return sale

The recommended way to handle transactions in Web requests is to tie them to the request and response phases via Django’s TransactionMiddleware.

It works like this: When a request starts, Django starts a transaction. If the response is produced without problems, Django commits any pending transactions. If the view function produces an exception, Django rolls back any pending transactions.

相关问题 更多 >

    热门问题