Django休息框架:UniqueValidator copare将字段转换为大写

use*_*364 4 django django-rest-framework

我可以将数据保存mac_address到数据库中的上部
并且mac_address值在数据库中应该是唯一的

但是,如果客户给我一个小写JSON喜欢{"mac_address":'aa:bb:cc:dd:eE'}
和我的数据库已经有mac_address'AA:BB:CC:DD:EE'
,但客户仍然得到了201 created success
为什么不我的UniqueValidator工作?
请帮我看看

views.py

我试着ListCreateAPIView,APIView
两者都不能很好地工作我认为问题是UniqueValidator一部分

我发现文档 使用validate_<field_name> 但我的代码不起作用

class DataList(generics.ListCreateAPIView):
    queryset = Data.objects.all()
    serializer_class = DataSerializer

    def perform_create(self, serializer):
        mac_address = self.request.data['mac_address'].upper()
        serializer.save(mac_address=mac_address, datetime=datetime.datetime.now(pytz.utc))
class DataList(APIView):
    def post(self, request, format=None):
        serializer = DataSerializer(data=request.data)
        if serializer.is_valid():
            mac_address = request.data['mac_address'].upper()
            serializer.save(mac_address=mac_address, datetime=datetime.datetime.utcnow().replace(tzinfo=pytz.utc))
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

并且序列化验证器需要先转换为小写,然后查询数据库.

class DataSerializer(serializers.ModelSerializer):
    datetime = ReadOnlyField()
    mac_address = CharField(max_length=50,
    validators=[UniqueValidator(queryset=Data.objects.all())]
)
    def validate_mac_address(self,value):
        return value.upper()
Run Code Online (Sandbox Code Playgroud)

lev*_*evi 5

valid_email方法定义到序列化程序中

class DataSerializer(serializers.ModelSerializer):

    email = CharField(
        max_length=255,
        validators=[UniqueValidator(queryset=BlogPost.objects.all())]
    )

    // your content and other stuff goes here

    def valid_email(self,value):
        return value.lower()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,正确的前缀是validate_而不是valid_。 (3认同)

Bur*_*lid 5

您的验证器应该进行实际验证:

class DataSerializer(serializers.ModelSerializer):
    datetime = ReadOnlyField()
    mac_address = CharField(max_length=50)

    def validate_mac_address(self,value):
        if Data.objects.filter(mac_address=value.upper()).exists():
            raise serializers.ValidationError("MAC address should be unique")
        return value.upper()
Run Code Online (Sandbox Code Playgroud)