2016-07-12 7 views
6

chcę mieć w sumie tylko do odczytu ModelSerializer, to tylko lista/odzyskać metodDjango Framework Reszta Read Only model serializer

jaki jest najlepszy sposób to zrobić?

+1

Czy tego chcesz, czy chcesz usunąć tworzenie/aktualizację z zestawów widoków? – Linovia

+3

Dobra pozycja @Linovia, właściwie szukam dla [ReadOnlyModelViewSet] (http://www.django-rest-framework.org/api-guide/viewsets/#readonlymodelviewset) – Mohsen

Odpowiedz

3

Jedyne, co musisz zrobić, to stworzyć taki serializator. serializers.py

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

Odwiedzin coś takiego

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

widoku szczegółów

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) 

Będzie to zrobić.

+2

Jednym ze sposobów na usprawnienie tego jest posiadanie 'read_only_fields = fields' w' Meta'. –

1

OK, kochany Mohsen, Aby zaimplementować serializer tylko do odczytu przy użyciu klasy BaseSerializer, wystarczy zastąpić metodę .to_representation(). Rzućmy okiem na przykład za pomocą prostego modelu Django:

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

To proste, aby utworzyć tylko do odczytu serializatora do konwersji instancji Najlepszy wynik w prymitywnych typów danych.

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

Zobacz mój komentarz do mojego posta. dziękuję Hamed, – Mohsen

+1

To zależy od widoku, ale twoja odpowiedź dotyczyła tylko serializerów tylko do odczytu. –

+0

Początkowo szukałem rozwiązania na poziomie Serializera, ale jest to bardziej naturalne, aby obsłużyć je na poziomie widoku, a do tego jest ReadOnlyModelViewSet – Mohsen

7

Naprawdę chcesz to zrobić w widoku poziomu (lub Viewset), co można zrobić z ReadOnlyModelViewSet.

(Wspomniałeś o tym w swoim komentarzu, ale pozostawiam to jako odpowiedź dla lepszej widoczności).