2015-08-04 8 views
5

Dokumenty na temat korzystania z to_representation jest nieco krótki. Ta metoda jest używana przez Django Rest Framework 3.0+ do zmiany reprezentacji danych w interfejsie API.Can to_representation() w Django Rest Framework dostęp do normalnych pól

Oto link dokumentacja:

http://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior

Tu jest mój bieżący kod:

from django.forms.models import model_to_dict 

class PersonListSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Person 
     fields = ('foo', 'bar',) 

    def to_representation(self, instance): 
     return model_to_dict(instance) 

Kiedy robię ten kod, zwraca wszystkie pola w modelu zamiast pól, które Podałem powyżej w class Meta: fields.

Czy można odwołać się do class Meta: fields w ramach metody to_representation?

+0

Nie jesteś pewien, co próbujesz zrobić, ale one nazywają 'self._readable_fields' w źródle. https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py#L438 –

Odpowiedz

16

DRF ma ModelSerializer ma już całą logikę, aby sobie z tym poradzić. W twoim przypadku nie powinieneś nawet dostosowywać to_representation. Jeśli trzeba go dostosować, polecam do pierwszego wywołanie super a następnie dostosować wyjście:

class PersonListSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 
     fields = ('foo', 'bar',) 

    def to_representation(self, instance): 
     data = super(PersonListSerializer, self).to_representation(instance) 
     data.update(...) 
     return data 

PS: Jeśli chcesz wiedzieć, jak to działa, magia w rzeczywistości nie występuje w ModelSerializer.to_representation. W rzeczywistości nawet nie stosuje tej metody. Jest on wdrażany regularnie pod numerem Serializer. Cała magia z modelami Django faktycznie dzieje się w get_fields, która wywołuje get_field_names, która następnie bierze pod uwagę parametry Meta.fields ...

+0

Bardzo szczegółowa i czytelna odpowiedź. Dziękuję @ miki725 –

+0

bez problemu. cieszę się, że uznałeś to za przydatne – miki725

+0

Absolutnie pomocne. Szukałem takiej odpowiedzi przez 3000 lat. –

Powiązane problemy