エンドポイントに渡されている複雑なJSONデータ構造を解析するために、カスタムシリアライザをDRFに書き込む方法を理解するのに苦労しています。 JSONは次のようになります。ここではDjango Rest Framework:カスタムJSONシリアライザ
{
"name": "new",
"site": "US",
"data": {
"settings": [],
"meta": {
"meta1":{}
}
}
}
は、私のバックエンドのコードです:
# views.py
class SaveData(views.APIView):
def post(self, request, *args, **kwargs):
name = request.POST.get('name')
site = request.POST.get('site')
data = request.POST.get('data')
しかしdata
は常にNone
を返します。 request
オブジェクトへの精密検査では、入ってくるJSONは次のようになります。
# POST attribute of request object
'name' = 'new'
'site' = 'US'
'data[settings][0] = ''
'data[meta][meta1][] = ''
は基本的にそれが適切にPythonのdict
とlist
オブジェクトにシリアライズ取得されていませんdata
キーに関連付けられているネストされたJSONオブジェクトのように見えます。私はカスタムDRFシリアライザの例を探していましたが、私が見つけたもののほとんどはDjangoモデルをシリアライズするためのものでしたが、その必要はありません。着信データはモデルに直接マッピングされません。代わりに、データを保存する前に処理を行う必要があります。
data
JSONを適切なPythonオブジェクトに正しく変換するカスタムシリアライザに関するアドバイスをお持ちの方はいらっしゃいますか?私はこれで始まりましたが、例外(When a serializer is passed a 'data' keyword argument you must call '.is_valid()' before attempting to access the serialized '.data' representation. You should either call '.is_valid()' first, or access '.initial_data' instead.
)がスローされます。ここに私が作成したカスタムシリアライザのコードがあります:
# serializers.py
class SaveDataSerializer(serializers.Serializer):
name = serializers.CharField()
site = serializers.CharField()
data = serializers.DictField()
def create(self, validated_data):
return dict(**validated_data)
ありがとう。