Django.db.utils.IntegrityError при отправке post-запроса с axios в vue

Я новичок в веб-разработке, поэтому, пожалуйста, объясните ваше решение Я пытаюсь отправить данные в конечную точку api, которую я создал с помощью django rest framework в vue с axios, но каждый раз, когда я это делаю, я получаю эту ошибку: django.db.utils.IntegrityError: NOT NULL constraint failed: main_checkbox.label (я знаю, что я создаю api не так, как он должен быть создан, но это уже другая проблема). Я могу сделать get запрос с axios без проблем, и я даже могу отправить данные post через html форму без проблем (но я не хочу этого делать, потому что я создаю одностраничное приложение с vue и не хочу, чтобы оно обновлялось при отправке). вот код vue :

<template>
  <div class="home">
    <input type="text" name="label" id="" v-model="label" />
    <input type="submit" value="Create" @click="createCheckbox" />
  </div>
</template>

<script>
import axios from "axios";
export default {
  data() {
    return {
      label: "",
    };
  },
  methods: {
    async createCheckbox() {
      let result = axios.post("http://127.0.0.1:8000/create/", {
        label: this.label,
      });
      console.log(result);
    },
  },
};
</script>

код представления django :

from rest_framework.response import Response
from rest_framework.decorators import api_view

from main.models import checkbox
from main.serializers import checkboxSerializer

@api_view(['POST'])
def create(request):
    checkboxobj = checkbox.objects.create(
        state=False, label=request.POST.get('label'))
    serialized = checkboxSerializer(checkboxobj)
    return Response(serialized.data)

django models :

from django.db import models

# Create your models here.


class checkbox(models.Model):
    label = models.CharField(max_length=50)
    state = models.BooleanField(default=False)

    def __str__(self):
        return self.label

Сериализаторы django :

from rest_framework.serializers import ModelSerializer

from main.models import checkbox


class checkboxSerializer(ModelSerializer):
    class Meta:
        model = checkbox
        fields = '__all__'

Одна из особенностей сериализаторов заключается в том, что они проверяют данные, которые пользователь отправляет на сервер. ModelSerializer может получить проверенные данные и создать запись, если вы используете метод save() после проверки с помощью is_valid(). Итак, в вашем views.py:

@api_view(['POST'])
def create(request):
    serializer = checkboxSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serialized.data)
    else:
        return Response(serializer.errors)

Как указано в ошибке, проблема не в том, что POST-запрос не выполняется. Скорее ошибка связана с базой данных. При вставке записи с помощью checkbox.objects.create. При создании записи поле label является нулевым. Возможно, фронт-энд отправляет нулевое значение для метки или произошла ошибка при разборе значения из POST-запроса.

Поскольку вы используете DRF, я бы предложил использовать CreateAPIView, он будет управлять парсингом и вставкой за вас.

Это должно сделать часть бэкенда:

class Checkbox(models.Model):
    label = models.CharField(max_length=50)
    state = models.BooleanField(default=False)

    def __str__(self):
        return self.label

class CheckboxSerializer(ModelSerializer):
    class Meta:
        model = Checkbox
        fields = '__all__'

class CreateCheckBox(CreateAPIView):
    serializer_class = CheckboxSerializer
Вернуться на верх