IntegrityError нулевое значение в столбце "name" отношения "tag" нарушает ограничение not-null
Я создал API и в настоящее время тестирую свой почтовый запрос с помощью Postman. Однако я продолжаю получать эту ошибку.
views.py
def post(self, request, *args, **kwargs):
serializer = TagSerializer(data=request.data)
tag_input = Tag.objects.create(name=request.POST.get("name"),
language=request.POST.get("language"))
if serializer.is_valid():
serializer.save(tag_input)
return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('id', 'name', 'language')
def create(self, validated_data):
return Tag.objects.create(**validated_data)
def to_representation(self, data):
data = super().to_representation(data)
return data
models.py
class Tag(models.Model):
name = models.CharField(max_length=256)
language = models.CharField(max_length=256)
objects = models.Manager()
def create(self, validated_data):
tag_data = validated_data.pop('tag')
Tag.objects.create(**tag_data)
return tag_data
def __str__(self):
return self.name or ''
Поле name в вашей модели тега не является nullable. Поэтому похоже, что вы пытаетесь создать модель тега без значения имени.
Мое предположение - ваш request.POST, вероятно, пуст. Вы проверяли его? Рекомендуемый способ - использовать request.data вместо этого.
https://www.django-rest-framework.org/api-guide/requests/
Кстати, если вы хотите использовать сериализатор, вы можете сделать весь процесс, вызывая его функции.
Итак, вы должны проверить, является ли сериализатор действительным, вызвав функцию
serializer.is_valid(raise_exception=True) и затем создать объект с помощью save(). А если вы хотите что-то более индивидуальное, вы можете переопределить метод .save() вашего сериализатора
def post(self, request, *args, **kwargs):
serializer = TagSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save() # the result contains the tag instance
Также более эффективным может оказаться использование CreateAPIView напрямую
https://www.django-rest-framework.org/api-guide/generic-views/
ps: Он не видит, куда вы направляетесь с serializer.save(tag_input).