Django Rest Framework如何验证对象列表?

5

我知道drf有一个接口可以向对象添加验证器,我有一个视图可以使用一个请求创建多个Param对象,我想验证是否存在两个或更多的对象,它们的namevalue字段相同,我该如何在序列化程序中验证对象列表?

models.py

class Param(models.Model):
    name = models.CharField(max_length=256)
    value = models.CharField(max_length=256)

    class Meta:
        unique_together = ('name', 'value')

serializers.py

class ParamSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.ParamKey
        fields = ['name', 'value']
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

views.py

class ParamViewSet(viewsets.ViewSet):

    def create(self, request):

        serializer = serializer.ParamKeySerializer(
            data=request.data, many=True)
        if serializer.is_valid():
            return Response()
        return Response()

https://dev59.com/emEh5IYBdhLWcg3wRBj5 - Stephen Rauch
你能提供一份最小化的示例吗?@Rhys - JPG
2个回答

9
你可以使用ListSerializer来实现这种功能。 ListSerializer类提供了一次性序列化和验证多个对象的行为。通常情况下,你不需要直接使用 ListSerializer,而是在实例化序列化器时应该简单地传递 many=True
更多信息请访问https://www.django-rest-framework.org/api-guide/serializers/#listserializer
class ParamListSerializer(serializers.ListSerializer):
    def validate(self, attrs):
        # Here attrs contains list of Params You can validate it here
        pass

    def create(self, validated_data):
        books = [Book(**item) for item in validated_data]
        return Book.objects.bulk_create(books)

class ParamSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.ParamKey
        fields = ['name', 'value']
        list_serializer_class = ParamListSerializer  # This specifies which list serializer class to user
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

    def validate(self, attrs):
        # enter your validations here
        pass

0

尝试这样做,也许会有帮助

class ParamSerializer(serializers. ModelSerializer):
    class Meta:
        model = Param
        fields = ['name', 'value']
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

    def validate(self, attrs):
        # your validatator code here

    def create(self, validated_data):
       paramkeys = validated_data.pop('your_list')
       for p in paramkeys:
           param, _ = Param.objects.get_or_create(name=p.name, value=p.value)


这种方式能验证对象列表吗? - Rhys Pang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接