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).

Вернуться на верх