如何验证 django Rest 框架的唯一约束?

Raf*_*oly 6 python django django-rest-framework

如何使用不在请求负载上的密钥验证唯一约束?

我需要验证的密钥是user_idsku但请求不包含user_id密钥。

有效负载示例:

{'sku': '123', data: []}
Run Code Online (Sandbox Code Playgroud)

序列化器:

class ProductConfiguration(serializers.Serializer):

    min_quantity = serializers.IntegerField(required=True)
    price = serializers.DecimalField(
        required=True,
        decimal_places=2,
        max_digits=10,
        coerce_to_string=False
    )


class ProductSerializer(serializers.ModelSerializer):

    sku = serializers.CharField(required=True)
    data = ProductConfiguration(many=True, required=True)

    class Meta:
        model = WholeSale

        # the "id" and "user_id" columns should not be included on the response
        exclude = ['id', 'user']
Run Code Online (Sandbox Code Playgroud)

我需要验证usersku密钥已经存在。

默认情况下,如果两个密钥user_idsku位于有效负载上drf可以处理Unique错误,如果其中一个密钥不在有效负载上,我如何验证这两个密钥?

Adh*_*h M 2

您可以从请求中获取用户数据

请求.用户

也许将它从视图传递给序列化器

data = request.data
data['user_id'] = request.user.pk
serializer = ProductSerializer(data)
Run Code Online (Sandbox Code Playgroud)

在序列化器中你可以做

def validate(self, data):
    user = data.get('user_id')
    sku = data.get('sku')

    record = WholeSale.objects.filter(user=user, sku=sku).first()

    if not record:
        raise serializers.ValidationError("This combo doesn't exist")

    return super().validate(data)
Run Code Online (Sandbox Code Playgroud)