You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中Order实例save()无法更新transaction_id问题排查

问题排查:Order模型transaction_id字段未更新且无报错

问题背景

编写商品结账代码时,尝试创建Order模型实例并更新其transaction_id字段,但该字段未在数据库中更新,且无任何报错信息。相关代码如下:

视图函数processOrder

@csrf_exempt
@user_passes_test(lambda u: u.is_authenticated and not u.is_analyst)
def processOrder(request):
    data = json.loads(request.body)
    transaction_id = datetime.now().timestamp()
    print(int(transaction_id))
    

    if request.user.is_authenticated:
        customer = Customer.objects.get(user=request.user)
        order, created = Order.objects.get_or_create(
            customer=customer, complete=False)
        total = int(data['form']['total'])
  
        try:
            order.transaction_id = int(transaction_id)
        except Exception as e:
            print(e)
       
        order.complete = True
        print(order.transaction_id)
        try:
            order.save() 
        except Exception as e:
            print(e)

Order模型定义

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    date_ordered = models.DateField(default="2014-02-20")
    complete = models.BooleanField(default=False)
    transaction_id = models.CharField(max_length=100, null=True)

    @property
    def shipping(self):
        shipping = False
        order_items = self.orderitem_set.all()
        for i in order_items:
            shipping = True
        return shipping

    @property
    def get_cart_total(self):
        order_items = self.orderitem_set.all()
        total = sum([item.get_total for item in order_items])
        return total

    @property
    def get_cart_items(self):
        order_items = self.orderitem_set.all()
        total = sum([item.quantity for item in order_items])
        return total

    def __str__(self) -> str:
        return str(self.id)

核心问题排查

  1. 字段类型不匹配
    模型中transaction_id定义为CharField(字符串类型),但视图代码中直接赋值了int类型的数值。虽然Python允许这种变量赋值,但Django在将数据同步到数据库时,可能因类型不匹配导致更新操作被静默忽略(未触发异常但未写入数据库)。

  2. date_ordered默认值类型错误
    模型中date_ordered是DateField,但默认值设置为字符串"2014-02-20",正确的做法应该传入date对象,这虽不是transaction_id未更新的直接原因,但可能引发其他潜在的数据库操作问题。

解决方案

1. 修正transaction_id赋值类型

将视图中赋值int类型的代码改为字符串类型,匹配模型字段定义:

try:
    # 将时间戳转为整数后再转成字符串,适配CharField
    order.transaction_id = str(int(transaction_id))
except Exception as e:
    print(e)

2. 修正date_ordered的默认值

将模型中date_ordered的默认值改为date对象:

from datetime import date

date_ordered = models.DateField(default=date(2014, 2, 20))

如果希望默认值为当前日期,可改为:

from django.utils import timezone

date_ordered = models.DateField(default=timezone.now().date())

3. 增加调试验证(可选)

在order.save()后,重新从数据库拉取实例并打印字段值,确认更新是否生效:

order.save()
# 重新获取数据库中的订单实例
updated_order = Order.objects.get(id=order.id)
print("数据库中transaction_id:", updated_order.transaction_id)

内容的提问来源于stack exchange,提问作者Khair Ahammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:15:11