5

Umożliwia powiedzieć, że ma wzór w taki sposób:różne walidację DRF serializatora jednej metody żądania

class MyModel(models.Model): 
    first_field = models.CharField() 
    second_field = models.CharField() 

oraz widok interfejsu API tak:

class MyModelDetailAPI(GenericAPIView): 
    serializer_class = MyModelSerializer 
    def patch(self, request, *args, **kwargs): 
     # Do the update 
    def post(self, request, *args, **kwargs): 
     # Do the post 

first_field jest pole, które dodaje się tylko w metodzie POST (i jest obowiązkowa), ale przy każdej aktualizacji użytkownik nie może zmienić jej wartości, dlatego pole w metodzie PATCH jest obowiązkowe , a nie.
Jak mogę napisać mój serializator, aby first_field był wymagany na POST, ale nie jest wymagany na PATCH. Czy jest jakiś sposób dynamicznego ustawiania wymaganego pola, więc nadal mogę używać mechanizmu sprawdzania poprawności DRF? Jakiś rodzaj metody wywoływania weryfikatora na żądanie?
chcę coś takiego na przykład:

class MyModelSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = MyModel 
     fields = { 
        'POST': ['first_field'] 
        'PATCH': [] 
       } 
+0

Jeśli format danych nie jest taka sama, to nie to samo serializer. Po prostu utwórz dwa różne serializery (prawdopodobnie jeden dziedziczy drugi lub oba dziedziczą wspólną bazę). – spectras

+0

Moje rozumienie serializers jest to, że są one przypuszczać, aby obsługiwać serializacji surowych danych do instancji modelu i od modelu przykład do surowych danych (JSON na przykład). Fakt, że łata jest to częściowa zmiana, można mieć wiele różnych permutacji wysłanego danych - to nie jest logiczne, aby mieć inną serializatora za permutacji. –

+0

Co masz na myśli przez "permutację"? Obiekty nie są uporządkowane, więc ich zawartość nie może być permutowana. W każdym razie, chcesz tutaj dodać lub usunąć pole. Więc nie jest to ten sam format. – spectras

Odpowiedz

4

potrzebuję więcej miejsca niż komentarze zapewnić, aby mój sens jasne. Oto, co proponuję:

  1. Różne formatowanie oznacza różne serializery.

    Tutaj masz na przykład MyModelSerializer i MyModelCreationSerializer. Utwórz je niezależnie, albo dziedzicz je i specjalizuj (jeśli ma sens).

  2. Użyj odpowiedniego haka GenericAPIView, aby zwrócić poprawną klasę serializera w zależności od self.action. To bardzo prosty przykład może być:

    class MyModelDetailAPI(GenericAPIView): 
        # serializer_class = unneeded as we override the hook below 
    
        def get_serializer_class(self): 
         if self.action == 'create': 
          return MyModelCreationSerializer 
         return MyModelSerializer 
    

    domyślne akcje w regularnych viewsets są udokumentowane here, są to:

    • create: metoda POST na URL trasy baza
    • list: GET metody na trasie podstawowej url
    • retrieve: Metoda GET dla adresu URL obiektu
    • update: Metoda PUT na o bject url
    • partial_update: metoda łata na obiekt URL
    • destroy: DELETE metodę na obiekt URL