簡體   English   中英

Django rest 框架:UniqueValidator 將字段轉換為大寫

[英]Django rest framework:UniqueValidator copare the field convert to upper case

我可以將mac_address保存到數據庫中的上層
並且mac_address值在數據庫中應該是唯一的

但是如果客戶端給我發送一個小寫的 json,比如{"mac_address":'aa:bb:cc:dd:eE'}
我的數據庫已經有mac_address'AA:BB:CC:DD:EE'
但是客戶端還是獲得了201 created success
為什么我的UniqueValidator不起作用?
請幫我找出來

視圖.py

我嘗試ListCreateAPIViewAPIView
兩者都不能很好地工作我認為問題是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)

並且序列化驗證器需要先轉換為小寫,然后再查詢數據庫。

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()

在序列化程序中定義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()

您的驗證器應該進行實際驗證:

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()

您的UniqueValidator正在按預期工作。 因為UniqueValidator的默認查找是“精確”。 而您需要“iexact”,它進行不區分大小寫的查找。 因此,將mac_address序列化器字段更改為:

mac_address = CharField(max_length=50,
    validators=[UniqueValidator(queryset=Data.objects.all(), lookup='iexact')]
)

注意:使用validate_前綴方法會起作用,但是當您嘗試使用序列化程序進行部分更新時可能會出現問題。 那時您希望序列化程序免除對mac_address字段的唯一性檢查,或者至少從您施加約束的查詢集中排除當前對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM