gpt4 book ai didi

Django 休息框架 :UniqueValidator copare the field convert to upper case

转载 作者:行者123 更新时间:2023-12-04 22:58:38 24 4
gpt4 key购买 nike

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

但是如果客户端给我发送一个小写的 json,比如 {"mac_address":'aa:bb:cc:dd:eE'}我的数据库已经有 mac_address'AA:BB:CC:DD:EE'但是客户端仍然有 201 created success为什么我的 UniqueValidator 不起作用?
请帮我找出来

View .py

我尝试 ListCreateAPIViewAPIView两者都不能很好地工作我认为问题是 UniqueValidator 部分

我发现 document 使用 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()

最佳答案

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

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

关于Django 休息框架 :UniqueValidator copare the field convert to upper case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33480303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com