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

Django调用save()保存Listing时bid字段报NOT NULL约束错误如何解决

错误原因

你的问题由两个核心错误导致:

  1. 字段名不匹配:Listing模型中定义的商品名称字段为saleitem,但你在视图中赋值时错误使用了不存在的item字段,同时模型的__str__方法也调用了不存在的self.item,属于隐性错误。
  2. bid字段非法空值:虽然模型中bid字段设置了default=0,但当request.POST.get("bid")获取不到值(或前端传值为空)时会返回None,直接赋值会覆盖默认值,而bid字段未设置null=True,触发数据库非空约束报错。

修复步骤

  1. 修正视图中的字段赋值逻辑,同时处理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")
  1. 修正模型的__str__方法,避免后续查询报错:
    修改models.py中Listing类的对应代码:
def __str__(self):
    return self.saleitem
  1. 检查前端表单:确认create_listing.html中出价输入框的name属性为bid,否则POST请求不会携带对应值。

优化建议

推荐使用Django自带的ModelForm处理表单提交,可自动完成字段校验、赋值,避免手动写赋值逻辑出现字段名不匹配的问题:

  1. 新建forms.py:
from django import forms
from .models import Listing

class ListingForm(forms.ModelForm):
    class Meta:
        model = Listing
        fields = ["saleitem", "description", "category", "bid", "image"]
  1. 重构视图逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:06:03