2017-08-24 7 views
0

私はクラスObjectと、stateのメソッドを持つdatetimeパラメータdtを持っています。 URLのdatetimeパラメータをObject.state()に渡すにはどうすればよいですか?モデルで使用するDjango RESTフレームワークシリアライザへのパラメータを渡す

モデル:

class Object(models.Model): 
    def state(self, dt=datetime.datetime.now()) -> dict: 
     ...stuff... 
     return {'dt': dt, 'other_stuff': stuff} 

ビュー:

class ObjectDetail(generics.RetrieveAPIView): 
    queryset = models.Object.objects.all() 
    serializer_class = serializers.ObjectSerializer 

    def get_serializer_context(self): 
     return {'dt': self.request.query_params.get('dt', datetime.datetime.now())} 

    def get(self, request, *args, **kwargs): 
     return self.retrieve(request, *args, **kwargs) 

シリアライザクラス:

class ObjectSerializer(serializers.HyperlinkedModelSerializer): 
    state = StateSerializer(read_only=True, context={'dt': self.context['dt']}) 

    class Meta: 
     model = models.Object 
     fields = ('state') 

class StateSerializer(serializers.Serializer): 
    dt = serializers.DateTimeField() 
    ... other stuff... 

あなたは私が余分なコンテキストとしてdtを渡ししようとしています見ることができるようにビューの前にコンテキストを設定した行state = StateSerializer(read_only=True, context={'dt': dt})。ここで問題となるのは、ObjectSerializerが初期化された場合、dtself.context['dt']でアクセスできないため、selfは定義されていません。

+0

'state'の目的は何ですか?オブジェクトが保存されるたびに更新されるべきか、別のアイデアがありますか? – wencakisa

+0

@wencakisa 'state'は渡された' dt 'に依存します。これは、オブジェクトの状態などから生成され、dictです。書き込みはできません。 – Tintin

答えて

1

stateserializers.SerializerMethodField()とし、次にget_stateメソッドを定義することです。新しいObjectSeializerは次のようになります。

class ObjectSerializer(serializers.HyperlinkedModelSerializer): 
    state = serializers.SerializerMethodField() 

    class Meta: 
     model = models.Object 
     fields = ('state') 

    def get_state(self, obj): 
     state = obj.state(self.context['dt']) 
     state_serializer = StateSerializer(state) 
     return state_serializer.data 
関連する問題