django rest 框架 ImageField 中的自定义验证错误消息

时间:2021-05-30 06:11:49

标签: django django-rest-framework postman

我正在尝试在 django rest 框架中创建我的自定义验证错误消息。

我有一个类似下面代码的 productSerializer:

class ProductSerializer(serializers.ModelSerializer):
    # validation

    name = serializers.CharField(error_messages={'blank': 'Please fillout the product name!'})

    price = serializers.FloatField(error_messages={'blank': 'Please fillout the product price!'})
    
    slug = serializers.SlugField(error_messages={'blank': 'Please fillout the product slug!'})

    size = serializers.CharField(error_messages={'blank': 'Please fillout the product size!'})

    description = serializers.CharField(error_messages={'blank': 'Please fillout the description!'})

    image = serializers.ImageField(error_messages={'blank': 'Please upload a photo image!'})

    # validation
    category = serializers.StringRelatedField(read_only=False)
    productType = serializers.StringRelatedField()
    user = serializers.StringRelatedField()
    
    class Meta:
        model = Product
        fields = "__all__"

我的 views.py 就像:

class ProductsList(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = ProductSerializer(data=request.data)
        category = Category.objects.get(name=request.data['category'])
        productType = ProductType.objects.get(name=request.data['productType'])

        if serializer.is_valid():
            serializer.save(category=category, productType=productType)
            return Response("SUCCESS!!!!!!", status=200)
        else:
            return Response(serializer.errors, status=400)

问题: 我希望图像字段错误消息是我写的,当它是空白的。 但是我总是遇到“没有提交文件”的消息。

问题: 如何验证图像字段为空?

3 个答案:

答案 0 :(得分:0)

你可以这样做:

"0"

答案 1 :(得分:0)

您可以将 object-level validation 添加到您的序列化程序以使用自定义消息引发 ValidationError。

你可以这样修改你的序列化器:

class ProductSerializer(serializers.ModelSerializer):
# validation

name = serializers.CharField(error_messages={'blank': 'Please fillout the product name!'})

price = serializers.FloatField(error_messages={'blank': 'Please fillout the product price!'})

slug = serializers.SlugField(error_messages={'blank': 'Please fillout the product slug!'})

size = serializers.CharField(error_messages={'blank': 'Please fillout the product size!'})

description = serializers.CharField(error_messages={'blank': 'Please fillout the description!'})

image = serializers.ImageField(required=False, error_messages={'blank': 'Please upload a photo image!'})

# validation
category = serializers.StringRelatedField(read_only=False)
productType = serializers.StringRelatedField()
user = serializers.StringRelatedField()

def validate(self, data):
    if "image" not in data:
        raise serializers.ValidationError("Please upload a photo image!")
    return data


class Meta:
    model = Product
    fields = "__all__"

编辑:您可能还需要为您的 ImageField 设置 required=False ,以便序列化程序不会在您的 .validate() 方法之前引发该字段丢失(因为在所有 serializers.Field 中默认情况下 required 为 True)。

您也可以测试 field-level validation,但恐怕在调用您的自定义字段级验证方法之前会出现缺少此字段的事实。

答案 2 :(得分:0)

只需在序列化器类中添加此 def validate_ 方法 -

def validate_image(self, image):

    image = image.strip()

    # this will check if the image is blank. If it is then it will raise a 
    # validation error.

    if not image:

        raise serializers.ValidationError("Please upload a photo image!")

    return image
相关问题