关系 "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)
.
看不到你要去哪里
我已经创建了一个 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)
.