gpt4 book ai didi

python - 为什么 Django 给我这个 "violates not-null constraint"错误?

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:35 25 4
gpt4 key购买 nike

错误:

null value in column "postal_code_id" violates not-null constraint

形式:

def add(request):
if request.method == 'POST':
address_form = AddressForm(request.POST)
company_form = CompanyForm(request.POST)
if address_form.is_valid() and company_form.is_valid():
print address_form.cleaned_data['postal_code'] # <-- prints (<PostalCode: V4N 1K6>, False)
address_form.save() # <------------------------------- occurs here
else:
print 'Address errors',address_form.errors
print 'Company errors', company_form.errors
else:
address_form = AddressForm()
company_form = CompanyForm()
return render(request, 'company/add.html', locals())

很明显,表单确实有一个有效的 PostalCode 对象,所以我不确定为什么它说它违反了非空约束。当然,我正在对表单做一些有趣的事情:

class AddressForm(ModelForm):
postal_code = CharField(max_length=10, validators=[validate_postal_code])
city = CharField(max_length=50, validators=[validate_non_whitespace])
province = CharField(max_length=50, validators=[validate_non_whitespace])
country = CharField(max_length=50, initial='Canada', validators=[validate_non_whitespace])

def clean_postal_code(self):
code = self.cleaned_data['postal_code']
code = code.upper()
code = re.sub('[^A-Z0-9]', '', code)
code = code[:3] + ' ' + code[-3:]
return code

def clean_country(self):
country = self.cleaned_data['country']

try:
country = Country.objects.get(name__iexact=country)
except Country.DoesNotExist:
raise ValidationError('Country does not exist')

return country

def clean_province(self):
province = self.cleaned_data['province']

if not Province.objects.filter(name__iexact=province).exists():
raise ValidationError('Province does not exist')

return province

def clean(self):
data = self.cleaned_data

if 'country' in data and 'province' in data:
try:
data['province'] = Province.objects.get(country=data['country'], name__iexact=data['province'])
if 'city' in data:
data['city'] = City.objects.get_or_create(name__iexact=data['city'], province=data['province'], defaults={'name':data['city']})[0]
if 'postal_code' in data:
data['postal_code'] = PostalCode.objects.get_or_create(code=data['postal_code'], city=data['city'])
except Province.DoesNotExist:
self._errors['province'] = self.error_class(['Province does not exist in that Country'])
del data['province']

return data

class Meta:
exclude = ['postal_code']
model = Address

具体来说,我将 postal_code 字段替换为文本字段,然后在“clean”方法中查找/创建对象。为什么这会让 Django 感到困惑?它最终获得了它需要的对象,不是吗?

最佳答案

您正在排除 postal_code,这将导致模型表单稍后在尝试保存期间跳过该字段。我遇到了类似的问题,不得不通过 django 代码进行跟踪以找出行为。顺便说一句,这是值得的。

您要做的是设置用于 postal_code 字段的小部件,而不是先排除再包含。

class AddressForm(ModelForm):
class Meta:
model = Address
widgets = {
'postal_code': CharField(max_length=10),
}

这应该允许模型正确验证字段并保存它。为简洁起见,我排除了您表格的其余部分。

编辑:

尝试将 CharField 用于 ForeignKey 在 ModelForm 中充满了恐怖。相反,将其转换为常规形式。无论如何,您似乎已经定义了大部分领域。然后依赖于您来验证字段是否有效,并且已经是数据库的成员。创建一个行为类似于 ModelForm 保存方法的保存方法,然后就可以了。

关于python - 为什么 Django 给我这个 "violates not-null constraint"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com