Od niedawna uczę się Pythona i Django i kiedy chcąc dodać w aplikacji RestAPI skorzystałem z frameworka Django Rest Framework utknąłem w momencie walidacji danych odebranych od użytkownika. Problem jest taki, że o ile standardowe walidatory typu czy pole jest wymagane itd. w serializerze działają poprawnie, tzn. w jsonie zwracanym w odpowiedzi na to co użytkownik przysłał widzę informację o tych błędach w danych o tyle kompletnie nie potrafię zmusić do działania własnych reguł sprawdzających te dane.
Po przeszukaniu sporej części internetu praktycznie wszędzie widzę tekst, że żeby dodać własne reguły wystarczy dopisać metodę
def validate(self, data):
w serializerze, który chcemy walidować. Problem jest taki, że ta metoda nie jest nigdy wywoływana, a wg zapewnień m.in. na stronie twórców frameworka powinno się to dziać po wywołaniu metody serializer.is_valid()
Serializer wygląda u mnie tak (tutaj obcięty z nieistotnych w tym momencie pól):
```python
class RegisterSerializer(serializers.Serializer):
password1 = serializers.CharField(required=True)
password2 = serializers.CharField(required=True)
def validate(self, data):
if data.get('password1') != data.get('password2'):
raise serializers.ValidationError("Errrrrorr")
return data
Potem mam taką metodę odbierającą dane:
@api_view(['POST'])
def register(request):
if request.method == 'POST':
serializer = RegisterSerializer(data=request.POST)
if serializer.is_valid():
serializer.save()
# ...
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Próbowałem też metodę is_valid() wywoływać z parametrem* raise_exception* ustawionym na True,
Siedzę nad tym już 2 dzień i ciągle po wysłaniu niepasujących haseł nie dostaję w zmiennej *serializer.errors *informacji o tym, że są niepoprawne. Jeśli ktoś ma pomysł co tu jest nie tak, albo patrzy na to i płacze, że ktokolwiek ośmielił się takie głupoty robić, a to przecież powinno zupełnie inaczej wyglądać to proszę żeby się podzielił spostrzeżeniami :)
Mam nadzieję, że nie zapomniałem wkleić jakiegoś istotnego dla sprawy fragmentu kodu, w razie czego uzupełnię.
Pozdrawiam,
Marek