2016-07-12 2 views
6

Je veux avoir un total en lecture seule ModelSerializer, à savoir que la liste/récupérer des méthodesDjango Rest Framework Read Only Modèle sérialiseur

quelle est la meilleure façon de le faire?

+1

Est-ce ce que vous voulez ou voulez-vous supprimer la création/mise à jour à partir des ensembles de vues? – Linovia

+3

bon point @Linovia, en fait je suis à la recherche de [ReadOnlyModelViewSet] (http://www.django-rest-framework.org/api-guide/viewsets/#readonlymodelviewset) – Mohsen

Répondre

3

La seule chose à faire est de créer un sérialiseur comme celui-ci. serializers.py

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

Vues quelque chose comme ça

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

vue détaillée

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) 

Cela fera.

+2

Une façon de rendre un peu plus rationalisé est d'avoir 'read_only_fields = fields' dans' Meta'. –

1

Ok Cher Mohsen, Pour implémenter un sérialiseur en lecture seule en utilisant la classe BaseSerializer, il suffit de surcharger la méthode .to_representation(). Jetons un coup d'oeil à un exemple en utilisant un simple modèle Django:

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

Il est simple de créer un sérialiseur en lecture seule pour convertir les instances de highscore en types de données primitifs.

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

regardez mon commentaire sur mon propre message. merci Hamed, – Mohsen

+1

Cela dépend de la vue, mais votre réponse était à propos de lecture seule sérialiseurs –

+0

Je cherchais initialement une solution au niveau Serializer, mais il est plus naturel de le gérer au niveau de la vue, et il y a ReadOnlyModelViewSet pour cela – Mohsen

7

Vous voulez vraiment faire au niveau vue (ou Viewset), que vous pouvez faire avec un ReadOnlyModelViewSet.

(Vous l'avez mentionné dans votre commentaire mais je le laisse comme réponse pour une meilleure visibilité).