关系 "tag" 的列 "name" 中的 IntegrityError 空值违反了非空约束

IntegrityError null value in column "name" of relation "tag" violates not-null constraint

我已经创建了一个 API,目前正在使用 Postman 测试我的 post 请求。但是,我一直收到此错误。

views.py

        def post(self, request, *args, **kwargs):
        serializer = TagSerializer(data=request.data)

        if serializer.is_valid(raise_exception=True):
            serializer.save(name=request.POST.get("name"),
                                       language=request.POST.get("language"))
            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 ''

您的标签模型中的名称字段不可为空。所以看起来您正在尝试创建没有名称值的 Tag 模型。

我猜你的 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).

看不到你要去哪里