多对多关系中的唯一验证错误
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
方法
上进行
我有一个带有唯一 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
方法