【问题标题】:IntegrityError null value in column "name" of relation "tag" violates not-null constraint关系“标签”的“名称”列中的 IntegrityError 空值违反非空约束
【发布时间】:2022-01-31 16:35:16
【问题描述】:

我创建了一个 API,目前正在使用 Postman 测试我的发布请求。但是,我不断收到此错误。

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 ''

【问题讨论】:

    标签: django django-rest-framework postman


    【解决方案1】:

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

    我的猜测是您的请求。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) 看不到你要去哪里。

    【讨论】:

    • 好的,我现在已经修改了我的代码(也在上面),但我一直收到同样的错误。
    猜你喜欢
    • 2023-03-13
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2016-01-18
    • 1970-01-01
    • 2020-08-20
    • 2019-04-08
    相关资源
    最近更新 更多