2017-05-19 6 views
3

Ich bin neu bei Django und konnte keine Lösung für mein Problem finden.django-rest-framework serializer verschiedene Felder in mehreren Ansichten

Das Problem besteht darin, bestimmte Serializer für unterschiedliche Anzahl von Feldern im Falle der Verwendung unterschiedlicher Ansichten zu erzwingen. Ich möchte das Feld "ID" in meiner ersten Ansicht verwenden und in der zweiten Ansicht die Felder "ID" und "Name".

Hier ist meine model.py

class Processing(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField() 
    description = models.CharField() 

Und hier ist mein serializer.py

class ProcessingSerializer(serializers.ModelSerializer): 
    id = serializers.ModelField(model_field=Processing()._meta.get_field('id')) 
    class Meta: 
     model = Processing 
     fields = ('id', 'name') 

Jede Hilfe willkommen sein wird.

+0

Haben Sie meine Antwort versucht? – e4c5

+0

@ e4c5 danke für die interessante Lösung, aber in meiner aktuellen App habe ich nur zwei ziemlich ähnliche Serialisierer erstellt, die sich nur durch ein extra Feld unterscheiden – sorryMike

+0

ist das nicht genau das, was ich dir vorgeschlagen habe? Verwenden Sie zwei verschiedene Serialisierer? – e4c5

Antwort

6

Wenn jemand nur DRF beginnt mit, ein häufiger Fehler ist, zu versuchen, das gleiche Serializer alles unter der Sonne zu tun zu machen. Sicher bin ich diesen Weg selbst gegangen.

aber das Leben wird viel einfacher, wenn Sie mehrere Serializer für verschiedene Aufgaben verwenden. Sie können Serializer einfach mit der get_serializer_class-Methode wechseln. Hier ist ein Beispiel direkt aus dem Handbuch, das zeigt, wie man für Administratoren verwenden und eine andere für normale Benutzer

def get_serializer_class(self): 
    if self.request.user.is_staff: 
     return FullAccountSerializer 
    return BasicAccountSerializer 

Manchmal möchte man eine einzelne Serializer für Listen verwenden und ein anderes für wenn Einzelheiten zu nennen. Versuchen Sie etwas wie folgt:

def get_serializer_class(self): 
    if self.action == 'retrieve': 
     return serializers.PlayerDetailSerializer 
    else : 
     return serializers.PlayerSerializer 

Das Leben ist viel einfacher auf diese Weise.

0

Von dem, was ich weiß,

Sie können dies nicht tun. Wenn Sie unterschiedliche Felder für verschiedene Ansichten wünschen, müssten Sie verschiedene Serializer schreiben.

1
class DynamicFieldsModelSerializer(ModelSerializer): 
    """ 
    A ModelSerializer that takes an additional `fields` and 'exclude' argument that 
    controls which fields should be displayed. 
    """ 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'fields' arg up to the superclass 
     fields = kwargs.pop('fields', None) 
     exclude = kwargs.pop('exclude', None) 

     # Instantiate the superclass normally 
     super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) 

     if fields is not None: 
      # Drop any fields that are not specified in the `fields` argument. 
      allowed = set(fields) 
      existing = set(self.fields.keys()) 
      for field_name in existing - allowed: 
       self.fields.pop(field_name) 

     if exclude is not None: 
      not_allowed = set(exclude) 
      for exclude_name in not_allowed: 
       self.fields.pop(exclude_name) 



class UserCreateSerializer(DynamicFieldsModelSerializer): 
    class Meta: 
     model = User 
     fields = ('username', 'tel', 'email', 'password') 

Verwendung:

serializer = UserCreateSerializer(data=request.data, fields=('username', 'password', 'tel')) 

oder

serializer = UserCreateSerializer(data=request.data, fields=('username', 'password', 'email')) 
Verwandte Themen