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

Django出现IntegrityError(1048):item_id_id列不能为NULL求助

解决Django提交SupplyItem表单时的IntegrityError(1048, "Column 'item_id_id' cannot be null")

错误核心原因

表单自定义字段名与模型字段名不匹配,导致Django无法自动将表单数据映射到模型的外键字段;同时表单的clean方法逻辑存在问题,无法有效校验必填字段,最终触发数据库非空约束错误。


具体修复步骤

1. 修正表单字段与模型字段的映射

直接使用模型原生字段名,通过labels和widgets配置显示样式,避免自定义字段名导致的映射失败。修改forms.py如下:

from django import forms
from .models import supplyItem, Supplier
from Items.models import Items

class SupplyItemForm(forms.ModelForm):
    class Meta:
        model = supplyItem
        fields = ['item_id', 'supplier_id', 'numOfItemsS']
        # 配置前端显示的标签名
        labels = {
            'item_id': 'Item name',
            'supplier_id': 'Supplier Company',
            'numOfItemsS': 'Quantity'
        }
        # 配置输入控件类型
        widgets = {
            'item_id': forms.Select(),
            'supplier_id': forms.Select(),
            'numOfItemsS': forms.NumberInput()
        }

    def clean_numOfItemsS(self):
        qty = self.cleaned_data.get('numOfItemsS')
        if qty <= 0:
            raise forms.ValidationError('Quantity must be a positive number!')
        return qty

    def clean_item_id(self):
        data = self.cleaned_data.get('item_id')
        if not data:
            raise forms.ValidationError('Please select a value!')
        return data

    def clean_supplier_id(self):
        data = self.cleaned_data.get('supplier_id')
        if not data:
            raise forms.ValidationError('Please select a value!')
        return data

2. 修复clean方法逻辑错误

  • 用self.cleaned_data.get()替代self.data.get(),避免手动类型转换出错(cleaned_data已完成Django自动类型转换)
  • ModelChoiceField未选择时返回None而非空字符串,因此用if not data判断空值

3. 优化视图逻辑(可选)

在post方法中添加表单验证失败的提示,同时支持提交成功后的重定向:

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import SupplyItemForm

class SupplyItem(View):
    template = 'SupplyItems.html'

    def get(self, request):
        form = SupplyItemForm()
        return render(request, self.template, {'form': form})

    def post(self, request):
        form = SupplyItemForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Supply item added successfully!')
            return redirect('supply_items')  # 替换为你的目标URL名称
        return render(request, self.template, {'form': form})

4. 修正Items模型的缩进问题

确保__str__方法属于Items类:

class Items(models.Model):
   item_id = models.AutoField(primary_key=True)
   item_name = models.CharField(max_length=50, null=False)
   item_qty = models.IntegerField(null=False)
   item_prc = models.FloatField(null=False)
   purchase = models.ManyToManyField('registration.Customer', through='Purchase.purchasedItem', related_name='items', blank=True)
   sell = models.ManyToManyField('registration.Employee', through='Sell.sellItem', related_name='items', blank=True)

   def __str__(self):
       return self.item_name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:50:22