SytuacjaOrder Serializatora Walidacja w Django REST ramowego
Pracując z walidacji w Django REST ramowego ModelSerializer
, zauważyłem, że pola Meta.model
są zawsze sprawdzane, nawet jeśli niekoniecznie sensu robić więc. Wykonaj następujący przykład serializacji modelu User
:
- Mam punkt końcowy, który tworzy użytkownika. Jako takie istnieje pole
password
iconfirm_password
. Jeśli te dwa pola nie pasują, nie można utworzyć użytkownika. Podobnie, jeśli żądana wersjausername
już istnieje, użytkownik nie może zostać utworzony. - słupkami użytkowników niewłaściwe wartości dla każdej z dziedzin wymienionych powyżej
- Implementacja
validate
zostało dokonane w serializatora (patrz poniżej), łapanie niepasującepassword
iconfirm_password
pola
Realizacja validate
:
def validate(self, data):
if data['password'] != data.pop('confirm_password'):
raise serializers.ValidationError("Passwords do not match")
return data
problem
Nawet po podniesieniu ValidationError
przez validate
, ModelSerializer
nadal wysyła zapytania do bazy danych, aby sprawdzić, czy username
jest już w użyciu. Jest to widoczne na liście błędów, która jest zwracana z punktu końcowego; występują błędy zarówno modelu, jak i błędów innych niż pola.
W związku z tym chciałbym wiedzieć, jak zapobiec sprawdzania poprawności modelu, aż po zakończeniu sprawdzania braku pola, zapisując wywołanie do mojej bazy danych.
próba rozwiązania
I zostały próbuje przejść przez źródła DRF by dowiedzieć się, gdzie to się dzieje, ale okazały się nieskuteczne w zlokalizowaniu co muszę zastąpić, aby uzyskać to do pracy .
O cholera, tak właśnie się wydarzyło. Czy uważasz, że właściwe byłoby po prostu pozwolić, aby walidacja trafiła do bazy danych, czy też powinienem ponownie wprowadzić unikalny walidator? – nmagerko
"pozwól, aby walidacja trafiła do bazy danych" spowoduje błędy integralności, więc zdecydowanie nie. Zalecam ponowne wdrożenie unikalnego walidatora, jeśli chcesz, aby to ostatnie działało. –
Właściwie, myślę, że mogę spróbować nadpisać 'to_internal_value' i sprawić, by to się skończyło. Niezależnie od tego, odpowiedziałeś na pytanie – nmagerko