2016-07-12 37 views
6

voglio avere un totale di sola lettura ModelSerializer, vale a dire proprio elenco/recuperare metodiDjango Resto quadro Read Only Modello Serializer

qual è il modo migliore per farlo?

+1

È ciò che si desidera o si desidera rimuovere la creazione/aggiornamento dai set di visualizzazione? – Linovia

+3

buon punto @Linovia, in realtà sto cercando [ReadOnlyModelViewSet] (http://www.django-rest-framework.org/api-guide/viewsets/#readonlymodelviewset) – Mohsen

risposta

3

L'unica cosa che devi fare è creare un serializzatore come questo. serializers.py

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

Visualizzazioni qualcosa di simile

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

dettaglio vista

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) 

Questo lo farà.

+2

Un modo per rendere questo un po 'più snella è avere 'read_only_fields = fields' in' Meta'. –

1

Ok caro Mohsen, per implementare un serializzatore di sola lettura che utilizza la classe BaseSerializer, abbiamo solo bisogno di sovrascrivere il metodo .to_representation(). Diamo un'occhiata a un esempio utilizzando un semplice modello di Django:

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

E 'semplice per creare un serializzatore di sola lettura per la conversione di istanze dei punteggi in tipi di dati primitivi.

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

guarda il mio commento sul mio post. grazie Hamed, – Mohsen

+1

Questo dipende dalla visualizzazione ma la tua risposta riguardava solo serializzatori di sola lettura –

+0

Inizialmente cercavo una soluzione in livello Serializer, ma è più naturale gestirla a livello di vista, e c'è ReadOnlyModelViewSet per quello – Mohsen

7

si vuole veramente fare questo la vista (o Viewset) livello, che si può fare con un ReadOnlyModelViewSet.

(l'hai menzionato nel tuo commento ma lo lascio come risposta per una migliore visibilità).