2017-07-11 9 views
2

Ich verwende den folgenden Serializer in den meisten requests wie GET, POST etc:Wie ändert man das Feld-Mapping im Django-Restframework-Serializer, der verschachtelte Serializer verwendet, dynamisch?

class PrescriptionSerializer(serializer.ModelSerializer): 
    tags = TagSerializer() 
    setting = SettingSerializer() 

Aber ich setting Feld SettingUpdateSerializer()if request.action ist UPDATE (= PUT/PATCH) zuordnen möchten. Ohne zu tauchen PrescriptionGetSerializer und PrescriptionUpdateSerialzer und sie entsprechend zu verwenden, gibt es eine Möglichkeit, Serializer-Schachtelfeld zu anderen Serialisierer dynamisch zuzuordnen, wie unten?

class PrescriptionSerializer(serializer.ModelSerializer): 
    tags = TagSerializer() 
    setting = SettingUpdateSerializer() 

ich aber über self.fields.pop auf __init__ verwenden, aber auf diese Weise ist es nur möglich, durch verschiedene unterschiedliche Feldnamen wie update_setting und get_setting verwenden.

Vielen Dank für die Hilfe im Voraus.

Antwort

1

Ich denke, die klarste Lösung ist die Erstellung von zwei separaten Serialisierer. Und wählen Sie aus, welcher Serializer in einer Ansichtsschicht vom http-Verb abhängt. Wenn Sie Viewset verwenden, ist es einfach in einer get_serializer_class Methode zu implementieren.

class SomeViewSet(viewsets.ModelViewset): 

    def get_serializer_class(self): 
     if self.action === 'update': 
      return UpdatePrescriptionSerializer 
     return PrescriptionSerializer 

Nun, wenn Sie eine get_serializer in Aktionen Methoden aufrufen, werden Sie Serializer erhalten, hängt von der Aktion.
Aber man könnte auch so etwas wie Sie tun, sagte:

class PrescriptionSerializer(serializer.ModelSerializer): 

    def __init__(self, *args, **kwargs): 
     super(PrescriptionSerializer, self).__init__(*args, **kwargs) 
     if self.context['request'].method == 'PUT': 
      self.fields['setting'] = SettingUpdateSerializer() 
     else: 
      self.fields['setting'] = SettingSerializer() 

    tags = TagSerializer() 

Einfach sicher, dass Sie eine Anfrage an Serializer Kontext übergeben. Wenn Sie die Methode get_serializer in einem Viewset verwenden, wird sie bereits übergeben.

+0

Alter, du bist ein Lebensretter. Ich kann nicht glauben, dass ich nicht über 'self.fields ['setting'] = SettingUpdateSerializer()' nachgedacht habe. Ich werde versuchen, die 'get_serializer_class' zu verwenden, wenn eine ähnliche Situation auftritt. Ich habe zu viel Legacy-Code, um das ganze nochmal neu schreiben zu können. Danke vielmals. – Bossam

+0

@Bossam kein Problem, ich bin froh, dass es dir geholfen hat :) –

Verwandte Themen