2017-04-26 5 views
0

私はDjangoとdjango-restframeworkを使用しています。シリアライザからデータ引数を取得するにはどうすればよいですか?

私は分かりませんシリアライザの引数にアクセスする方法。

serializer.dataから完全なjsonデータにアクセスできます。しかし、私がidのような引数を取ろうとすると、エラーを返します。 serializer.data.id

どうすれば入手できますか?私はこれを検索するのに多くの時間を費やしましたが、失敗しました。

これは、ユーザー入力に基づく更新モデルです。

  1. ユーザ入力id
  2. そのデータを取得するid
  3. そのデータをデータベースに保存します。

これを読んでいただきありがとうございます。

views.py

class CareerViewSet(viewsets.ModelViewSet): 
    queryset = Career.objects.all() 
    serializer_class = CareerSerializer 
    permission_classes = (IsCreateable,) 

    def perform_create(self, serializer): 
     serializer.save(nickname='test') 
     print(serializer.data) 
     print(serializer.data.id) 

{'id': 14, 'created': '2017-04-26T12:39:58.249038Z', 'modified': '2017-04-26T12:39:58.249538Z', 'battle_tag': 'Fortune-1130', 'nickname': 'test', 'quick_eliminations': None, 'quick_damage_done': None, 'quick_deaths': None, 'quick_final_blows': None, 'quick_healing_done': None, 'quick_objective_kills': None, 'quick_objective_time': None, 'quick_solo_kills': None, 'competitive_eliminations': None, 'competitive_damage_done': None, 'competitive_deaths': None, 'competitive_final_blows': None, 'competitive_healing_done': None, 'competitive_objective_kills': None, 'competitive_objective_time': None, 'competitive_solo_kills': None, 'games_won': None, 'competitive_rank': None, 'level': None} 
Internal Server Error: /career/ 
Traceback (most recent call last): 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\django\core\handlers\exception.py", line 42, in inner 
    response = get_response(request) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\rest_framework\viewsets.py", line 83, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\rest_framework\views.py", line 483, in dispatch 
    response = self.handle_exception(exc) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\rest_framework\views.py", line 443, in handle_exception 
    self.raise_uncaught_exception(exc) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\rest_framework\views.py", line 480, in dispatch 
    response = handler(request, *args, **kwargs) 
    File "E:\Development\Venv\20170420\myvenv\lib\site-packages\rest_framework\mixins.py", line 21, in create 
    self.perform_create(serializer) 
    File "E:\Development\Venv\20170420\overmatch_django\overwatch\views.py", line 38, in perform_create 
    print(serializer.data.id) 
AttributeError: 'ReturnDict' object has no attribute 'id' 

答えて

3

serializer.dataエラーは、アクセスそれあなたがバニラ辞書と同じように、辞書のサブクラス(すなわちReturnDict)です:

id = serializer.data['id'] 
+0

ありがとうございました!!!! – HoJunLee

+0

'id = serializer.data.get( 'id'、None)'をお勧めします。 –

1

使用シリアライザ.data.get( 'id')。 serializer.data.idはクラスオブジェクトではなく、むしろjson/dictで動作します。

関連する問題