如何解决将Django表单保存到mssql数据库时将数据类型nvarchar转换为数值时出错
我将django-pyodbc-azure与mssql一起使用,并且在我的models.py中设置了一些字段作为外键:
class Production(models.Model):
date = models.CharField(max_length=10,null=True)
dateGr = models.DateField(auto_now=False,auto_now_add=False,null=True)
comName = models.CharField(max_length=100,null=True)
comId = models.ForeignKey(Company,on_delete=models.CASCADE,null=True)
prodName = models.CharField(max_length=100,null=True)
prodId = models.ForeignKey(Product,null=True)
gradeId = models.ForeignKey(ProductGrade,null=True)
gradeName = models.CharField(max_length=100,null=True)
gradeType = models.CharField(max_length=3,null=True)
gradeTypeId = models.ForeignKey(GradeType,null=True)
qty = models.FloatField(null=True)
cap = models.FloatField(null=True)
designCap = models.FloatField(null=True)
plan = models.FloatField(null=True)
unitId = models.ForeignKey(QtyUnit,null=True)
unit = models.CharField(max_length=20,null=True)
我这样写了forms.py:
class CreateProduction(forms.ModelForm):
class Meta:
model = Production
fields = ['date','comId','prodId','gradeId','gradeTypeId','unitId','qty']
widgets = {
'date': forms.TextInput(attrs={'class': 'form-control','name': 'tdate','id': 'input-tdate'}),'comId': forms.Select(attrs={'class': 'form-control'}),'prodId': forms.Select(attrs={'class': "form-control"}),'gradeId': forms.Select(attrs={'class': 'form-control'}),'gradeTypeId': forms.Select(attrs={'class': 'form-control'}),'unitId': forms.Select(attrs={'class': 'form-control'}),'qty': forms.NumberInput(attrs={'class': 'form-control','id': 'qty','type': 'number','value': '0'}),}
def __init__(self,user,comId,*args,**kwargs):
super(CreateProduction,self).__init__(*args,**kwargs)
self.fields['comId'].queryset = Company.objects.filter(userId=user)
self.fields['prodId'].queryset = Product.objects.filter(comId=comId)
products = Product.objects.filter(comId=comId)
self.fields['gradeId'].queryset = ProductGrade.objects.filter(prodId__in=products)
用于将我的表单数据保存到数据库的函数如下:
@login_required(login_url='login')
@allowed_users(allowed_roles=['editor'])
def create_production(request):
print(request)
if request.method == 'POST':
comId = Company.objects.values_list('id',flat=True).get(userId=request.user)
form = CreateProduction(request.user,request.POST)
if form.is_valid():
production = form.save(commit=False)
print(request.POST)
production.user = request.user
production.save()
return redirect('/')
else:
comId = Company.objects.values_list('id',comId)
return render(request,'production/production_form.html',{'form': form})
当我从forms.py和模板中删除与“ unitId”相关的行,并且将数据插入到db中时,整个代码绝对可以正常工作。 但是,当我添加与“ unitId”相关的行时,出现此错误: (“ 42000”,“ [42000] [Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]将数据类型nvarchar转换为数字时出错。(8114)(SQLExecDirectW)”) 我不知道“ unitId”字段有什么问题
解决方法
所以问题是date的值,因为我的项目的日期在波斯语中,所以我必须在模型中将date字段定义为CharField,并且因为date的值在波斯数据库中因为它是Unicode而不接受该值,所以我在views.py中添加了以下一行:
production.date = unidecode(str(request.POST.get('date')))
这解决了错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。