2015-11-02 2 views
3

я могу сохранить mac_address к верхней в базе данных
И значение mac_address должно быть уникальным в базе данныхДжанго рамки остальное: UniqueValidator copare поле преобразовать в прописные

Но если клиент посылает мне строчную JSON как {"mac_address":'aa:bb:cc:dd:eE'}
и моя база данных уже были mac_address с 'AA:BB:CC:DD:EE'
Но клиент все еще есть 201 created success
Почему бы не моя UniqueValidator работы ??
Пожалуйста, помогите мне найти

views.py

Стараюсь ListCreateAPIView и APIView
И не может хорошо работать, я думаю, что проблема 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) 

И сериализовать valida tor необходимо сначала преобразовать в нижний регистр, затем запросить базу данных.

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

ответ

1

Ваш валидатор должен делать фактическую проверку:

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

определяют 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() 
+0

Как '' '' 'valid_email'''' знаю, чтобы преобразовать '' '' email'''', чтобы понизить ?? У меня есть имя поля '' '' address'''', и я использовал '' '' valid_address'''', но не работал – user2492364

+0

@ user2492364 DRF выполняет valid_ , если существует. – levi

+0

Обратите внимание, что правильный префикс validate_ и not valid_. –

Смежные вопросы