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