Buduję RESTful API przy użyciu struktury REST Django. Jeden z moich modeli wygląda trochę tak:
class Zone(models.Model):
name = models.SlugField(max_length=50, unique=True)
... other fields
Więc zbudowałem serializator w ten sposób:
class ZoneSerializer(serializers.ModelSerializer):
class Meta:
model = Zone
fields = ("name", ... other fields)
Podczas publikowania danych w celu utworzenia nowej strefy, nie jestem pewien, za jaką walidację odpowiadam i jak wiele powinno się odbywać automatycznie. Próbowałem następujących przypadków testowych:
- Gdy
name
jest poprawnym błędem liczącym 50 znaków lub mniej, sprawdzanie poprawności się powiedzie. - Gdy
name
jest poprawnym błędem składającym się z ponad 50 znaków, sprawdzanie poprawności kończy się niepowodzeniem z odpowiednim komunikatem o błędzie. - Gdy
name
jest nieprawidłowym plikiem (np. "abc def"), sprawdzanie poprawności kończy się pomyślnie i tworzona jest strefa z niepoprawną nazwą.
Wkopując się w kod widzę, że długość pola jest sprawdzane przez django.core.validators.MaxLengthValidator
w run_validators
w rest_framework/fields.py
, ale validate_slug
nie znajduje się na liście walidatorów.
Wiem, że mogę dodać validate_name
metoda do mojego serializera w ten sposób:
def validate_name(self, attrs, source):
"""
Make sure this is a slug field
"""
value = attrs[source]
if not validators.validate_slug(value):
raise serializers.ValidationError("Not a slug")
return attrs
ale wydaje się to przesadą. Czy robię coś złego tutaj?
Odpowiedzi:
2 dla odpowiedzi № 1Wygląda na to, że istnieje ważne żądanie ściągnięcia. :) validate_slug
prawdopodobnie powinno nastąpić automatycznie.
Najlepszy sposób działania:
- Dokładnie sprawdź zachowanie pola formularza Django w odniesieniu do zachowania pola serializera w strukturze REST - czy są one zdecydowanie inne?
- Podnieś bilet na wydanie, zauważając, co określiłeś (1).
- Spróbuj napisać nieudany test testowy i prześlij go jako żądanie ściągnięcia.
- Zaktualizuj PR z poprawką, jeśli to możliwe.
- Zysk! 11 !!!! (Cóż, weź swoje nazwisko w napisach i ciesz się, że przyczyniłeś się do naprawy)
Twoje zdrowie,
Tomek