多对多关系中的唯一验证错误

Unique validation error in many to many relations

我有一个带有唯一 name 字段的序列化程序:

class ProductTypeSerializer(serializers.ModelSerializer):
    url = serializers.URLField(source='get_absolute_url', read_only=True)
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(validators=[
        UniqueValidator(queryset=ProductType.objects.all())
    ])
    user =  UserSerializer(required=False)
    publish = serializers.BooleanField(required=False)

    class Meta:
        model = ProductType
        fields = ('url',
                  'id',
                  'name',
                  'publish',
                  'user',
                  'register_date')

另一方面,还有另一个序列化器与具有唯一名称字段的序列化器具有多对多关系:

class BrandSerializer(serializers.ModelSerializer):
    url = serializers.URLField(source='get_absolute_url', read_only=True)
    id = serializers.IntegerField(required=False)
    name = serializers.CharField()
    product_types = ProductTypeSerializer(many=True, required=False)
    user = UserSerializer(required=False)

    class Meta:
        model = Brand
        fields = ('url',
                  'id',
                  'name',
                  'product_types',
                  'publish',
                  'user',
                  'register_date')

    def create(self, validated_data):
        print  'validated_data:', validated_data
        request = self.context['request']
        name = validated_data.get('name', None)
        publish = validated_data.get('publish', False)
        product_types_data = validated_data.pop('product_types', None)
        product_types = []
        for pt in product_types_data:
            product_type = ProductType.objects.get(pk=pt['id'])
            product_types.append(product_type)
        obj = Brand.objects.create(
            name=name,
            publish=publish,
            user=request.user
           )
        obj.product_types.add(*product_types)
    return obj

当我 post 带有 BrandSerializer:

的品牌数据时,我得到一个独特的验证错误
{"product_types":[{"name":["This field must be unique."]}]}

当我们使用 BrandSerializer 创建品牌时,如何抑制 ProductTypeSerializer 的验证?

将您的 product_type 字段设置为 read_only 字段并创建它,从 request.data 而不是 validated data

获取数据
class BrandSerializer(serializers.ModelSerializer):
    url = serializers.URLField(source='get_absolute_url', read_only=True)
    id = serializers.IntegerField(required=False)
    name = serializers.CharField()
    product_types = ProductTypeSerializer(many=True, read_only=True)
    user = UserSerializer(required=False)

    class Meta:
        model = Brand
        fields = ('url',
                  'id',
                  'name',
                  'product_types',
                  'publish',
                  'user',
                  'register_date')

    def create(self, validated_data):
        print  'validated_data:', validated_data
        request = self.context['request']
        name = validated_data.get('name', None)
        publish = validated_data.get('publish', False)
        product_types_data = request.data.get('product_types', None)
        product_types = []
        for pt in product_types_data:
            product_type = ProductType.objects.get(pk=pt['id'])
            product_types.append(product_type)
        obj = Brand.objects.create(
            name=name,
            publish=publish,
            user=request.user
           )
        obj.product_types.add(*product_types)
    return obj

如果您想验证 product_type 是否作为请求中的参数传递,您可以在 clean 方法

上进行