Django调用save()保存Listing时bid字段报NOT NULL约束错误如何解决
错误原因
你的问题由两个核心错误导致:
- 字段名不匹配:
Listing模型中定义的商品名称字段为saleitem,但你在视图中赋值时错误使用了不存在的item字段,同时模型的__str__方法也调用了不存在的self.item,属于隐性错误。 - bid字段非法空值:虽然模型中
bid字段设置了default=0,但当request.POST.get("bid")获取不到值(或前端传值为空)时会返回None,直接赋值会覆盖默认值,而bid字段未设置null=True,触发数据库非空约束报错。
修复步骤
- 修正视图中的字段赋值逻辑,同时处理bid的空值情况:
修改views.py中对应代码:
from decimal import Decimal, InvalidOperation def create_listing(request): if request.method == "POST": saleitem = Listing() saleitem.user = request.user # 修正字段名匹配模型的saleitem saleitem.saleitem = request.POST.get("item") saleitem.description = request.POST.get("description") saleitem.category = request.POST.get("category") # 安全处理bid字段,空值/非法值默认用0 bid_raw = request.POST.get("bid") try: saleitem.bid = Decimal(bid_raw) if bid_raw else Decimal(0) except InvalidOperation: saleitem.bid = Decimal(0) saleitem.image = request.POST.get("image_upload") saleitem.save() listings = Listing.objects.all() empty = len(listings) == 0 return render(request, "auctions/active_listing.html",{ "listings": listings, "empty": empty }) else: return render(request, "auctions/create_listing.html")
- 修正模型的
__str__方法,避免后续查询报错:
修改models.py中Listing类的对应代码:
def __str__(self): return self.saleitem
- 检查前端表单:确认
create_listing.html中出价输入框的name属性为bid,否则POST请求不会携带对应值。
优化建议
推荐使用Django自带的ModelForm处理表单提交,可自动完成字段校验、赋值,避免手动写赋值逻辑出现字段名不匹配的问题:
- 新建
forms.py:
from django import forms from .models import Listing class ListingForm(forms.ModelForm): class Meta: model = Listing fields = ["saleitem", "description", "category", "bid", "image"]
- 重构视图逻辑:
def create_listing(request): if request.method == "POST": form = ListingForm(request.POST) if form.is_valid(): saleitem = form.save(commit=False) saleitem.user = request.user saleitem.save() listings = Listing.objects.all() return render(request, "auctions/active_listing.html",{ "listings": listings, "empty": len(listings) == 0 }) else: form = ListingForm() return render(request, "auctions/create_listing.html", {"form": form})
内容的提问来源于stack exchange,提问作者reuwrie
相关产品推荐
相关产品推荐

