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)
核心问题排查
字段类型不匹配
模型中transaction_id定义为CharField(字符串类型),但视图代码中直接赋值了int类型的数值。虽然Python允许这种变量赋值,但Django在将数据同步到数据库时,可能因类型不匹配导致更新操作被静默忽略(未触发异常但未写入数据库)。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
相关产品推荐
相关产品推荐

