Ошибка преобразования типа данных nvarchar в числовой при сохранении формы django в базе данных mssql

#python #sql-server #django #django-forms #django-pyodbc-azure

#python #sql-сервер #django #django-forms #django-pyodbc-azure

Вопрос:

Я использую 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, on_delete=models.CASCADE, null=True)
    gradeId = models.ForeignKey(ProductGrade, on_delete=models.CASCADE, null=True)
    gradeName = models.CharField(max_length=100, null=True)
    gradeType = models.CharField(max_length=3, null=True)
    gradeTypeId = models.ForeignKey(GradeType, on_delete=models.CASCADE, 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, on_delete=models.CASCADE, 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, comId, 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', flat=True).get(userId=request.user)
        form = CreateProduction(request.user, comId)
    return render(request, 'production/production_form.html', {'form': form})
  

Весь этот код работает абсолютно нормально, когда я удаляю строки, связанные с «UnitID», из моего forms.py шаблон и данные вставляются в базу данных.
Но когда я добавляю строки, связанные с «UnitID», я получаю эту ошибку:
(‘42000’, ‘[42000] [ Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Ошибка преобразования типа данных nvarchar в числовой. (8114) (SQLExecDirectW)’)
Я не понимаю, в чем проблема с полем «UnitID»

Комментарии:

1. какое значение UnitID в форме

2. Его значение — это число, которое является идентификатором в таблице UnitQty

3. Каково точное строковое значение UnitID в форме? Если это отформатированное число типа 12,345 или 1.2345e5 , то SQL Server не сможет преобразовать его обратно в int без посторонней помощи.

4. Значение равно ‘1’, а столбец UnitID в SQL равен int, проблем быть не должно, я не понимаю, это то же самое, что gradeTypeId, но gradeTypeId работает нормально

5. новое обновление заключается в том, что если я удаляю коды, связанные с gradeTypeId, и сохраняю UnitID, все работает нормально, поэтому проблема не в поле UnitID

Ответ №1:

Итак, проблема заключалась в значении date поскольку дата моего проекта указана на персидском языке, мне пришлось определить поле date как CharField в моей модели, и поскольку значение date было на персидском языке, база данных не принимала значение из-за его Юникода, поэтому я добавил строку в свою views.py следующим образом:

 production.date = unidecode(str(request.POST.get('date')))
  

Это исправило ошибку.