2016-07-12 7 views
6

ich insgesamt nur ModelSerializer gelesen haben will, das heißt nur Liste/abrufen MethodenDjango Rastrahmen Read Only Modell Serializer

was ist der beste Weg, es zu tun?

+1

Möchten Sie die Create/update aus den View-Sets entfernen? – Linovia

+3

guter Punkt @Linovia, eigentlich bin ich auf der Suche nach [ReadOnlyModelViewSet] (http://www.django-rest-framework.org/api-guide/viewsets/#readonlymodelviewset) – Mohsen

Antwort

3

Das einzige, was Sie tun müssen, ist einen Serializer wie folgt zu erstellen. serializers.py

class YourdataSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Yourdata 
     # some data 
     fields = ('id', 'city', 'pincode', 'created') 
     read_only_fields = ('id', 'city', 'pincode', 'created') 

Ansichten so etwas wie diese

class YourdataList(APIView): 
    def get(self, request, format=None): 
     yourdata = YourdataList.objects.all() 
     serializer = YourdataSerializer(yourdata, many=True) 
     return Response(serializer.data) 

Detailansicht

class YourdataDetail(APIView): 
    def get_object(self, pk): 
     try: 
      return Yourdata.objects.get(pk=pk) 
     except Yourdata.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     serializer = YourdataSerializer(snippet) 
     return Response(serializer.data) 

Dies wird es tun.

+2

Ein Weg, um dies ein wenig stromlinienförmiger zu machen ist zu haben 'read_only_fields = fields' in' Meta'. –

1

Ok lieber Mohsen, Um einen schreibgeschützten Serializer mit der BaseSerializer-Klasse zu implementieren, müssen wir nur die .to_representation() -Methode überschreiben. Lassen Sie uns einen Blick darauf werfen, ein einfaches Django-Modell an einem Beispiel mit:

class HighScore(models.Model): 
created = models.DateTimeField(auto_now_add=True) 
player_name=models.CharField(max_length=10) 
score = models.IntegerField() 

Es ist einfach, einen Nur-Lese-Serializer zur Umwandlung von Highscore-Instanzen in primitiven Datentypen zu erstellen.

class HighScoreSerializer(serializers.BaseSerializer): 
def to_representation(self, obj): 
    return { 'score': obj.score, 'player_name': obj.player_name } 
+0

Blick auf meinen Kommentar zu meinem eigenen Beitrag. Danke Hamed, – Mohsen

+1

Das ist abhängig von der Ansicht, aber Ihre Antwort war über nur Serialisierer lesen –

+0

Ich war zunächst auf der Suche nach einer Lösung in Serializer-Ebene, aber es ist natürlicher, es in View-Level zu behandeln, und es gibt ReadOnlyModelViewSet dafür – Mohsen

7

Sie wirklich wollen, dies im Blick (oder Viewset) Ebene tun, die Sie mit einem ReadOnlyModelViewSet tun können.

(Sie erwähnten dies in Ihrem Kommentar, aber ich lasse es als eine Antwort für bessere Sichtbarkeit).