Django模拟支付系统提交表单报Field 'id'类型不匹配错误如何解决
报错修复方案
错误原因
你在Payment模型中定义的cart是关联Cart表的外键,Django会自动为该外键生成cart_id存储字段,该字段默认存储的是Cart表的整数类型主键id,而非你自定义的Cart.cart_id字符串字段。你直接把session生成的字符串类型cart_id赋值给了Payment.cart_id,类型不匹配触发报错。
修复步骤
修改views.py中payment_charge视图的赋值逻辑,先查询到对应的Cart实例再赋值:
from django.contrib.auth.decorators import login_required # 加登录验证,保证能取到对应的用户购物车 @login_required def payment_charge(request): if request.method == "POST": form = PaymentForm(request.POST, request.FILES) if form.is_valid(): post = form.save(commit=False) # 替换原来的post.cart_id = _cart_id(request) 代码 # 用session的cart_id和当前登录用户查询对应的购物车实例 cart = Cart.objects.get(cart_id=_cart_id(request), customer=request.user) post.cart = cart post.save() return redirect('cart:cart_detail') else: form = PaymentForm() context = { 'form' : form } return render(request, 'cart/payment_form.html', context)
额外优化建议
- 当前
Payment模型中银行卡号、有效期、CVC、密码都用IntegerField存储不合理,比如16位银行卡号超出了IntegerField的最大存储范围,建议改为CharField存储。 - 如果确实需要让外键直接关联
Cart的cart_id字符串字段,可以修改Payment模型的外键定义(不推荐,默认关联主键性能更优):
class Payment(models.Model): cart = models.ForeignKey(Cart, on_delete=models.CASCADE, to_field='cart_id') # 其余字段保持不变
内容的提问来源于stack exchange,提问作者hide
相关产品推荐
相关产品推荐

