2016-07-12 2 views
6

私はすなわちちょうどリスト/メソッドにDjangoの残りFrameworkの読み取り専用モデルシリアライザ

を取得し、それを行うための最善の方法は何ですか?、唯一ModelSerializer読ん合計を持つようにしたいですか

+1

それはあなたが望むものか、またはビューセットから作成/更新を削除したいですか? – Linovia

+3

良い点@リノビア、実際には[ReadOnlyModelViewSet](http://www.django-rest-framework.org/api-guide/viewsets/#readonlymodelviewset)を探しています – Mohsen

答えて

3

このようなシリアライザを作成するだけです。 serializers.py

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

ビューこの

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

詳細ビュー

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) 

これはそれを行いますのようなもの。

+2

これを少し簡素化する1つの方法は、 'meta'の' read_only_fields = fields'です。 –

1

親愛なるMohsen、BaseSerializerクラスを使用して読み取り専用シリアライザを実装するには、.to_representation()メソッドをオーバーライドする必要があります。のは、シンプルなDjangoのモデルを使用した例を見てみましょう:

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

これは、プリミティブデータ型にハイスコアインスタンスを変換するための読み取り専用のシリアライザを作成するために簡単です。

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

自分の投稿に自分のコメントを見てください。 ありがとうハムード、 – Mohsen

+1

それはビューに依存しますが、あなたの答えは読者専用のシリアライザに関するものでした。 –

+0

私は当初、シリアライザレベルのソリューションを探していましたが、ビューレベルでそれを扱うのが自然で、ReadOnlyModelViewSetがあります – Mohsen

7

は、あなたは本当にあなたがReadOnlyModelViewSetで行うことができますビュー(またはビューセット)レベルでこれをやりたいです。

(これはあなたのコメントに記載されていますが、よりわかりやすくするために回答として残しています)。

関連する問題