2016-05-23 22 views
0

これでjsonによってdjangoアプリケーションに新しいデータをPOSTできますが、データを更新したり削除することはできません。私は、serializer.pyのupdateメソッドをオーバーライドしようとしますが、それでも動作しません。データは元の値を保持します。Django REST:ネストされたModelSerializerのデータをPUTする方法(アップデート)

私の質問は、すべてのデータを一度に更新し、subtaskdata、friendsdata、またはchatroomdataなどのデータ個人を削除する方法です。

私serializer.pyの一部

class SubtaskDataSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = SubtaskData 
     fields = ("subtask_name","subtask_deadline","subtask_completion", 
       "subtask_importance","subtask_item") 
     depth = 3 

class TaskDataSerializer(serializers.ModelSerializer): 
    SubtaskDatas = SubtaskDataSerializer(many = True) 
    class Meta: 
     model = TaskData 
     fields = ("task_name", "task_is_group", 
       "task_time", "task_score", "task_member_list", 
       "task_bulletin","SubtaskDatas") 
     read_only_fields = ('SubtaskDatas',) 
     depth = 2     

class FriendsDataSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FriendsData 
     fields = ("friend_name","friend_account") 
     depth = 2 


class UserDataSerializer(serializers.ModelSerializer): 
    TaskDatas = TaskDataSerializer(many = True) 
    FriendsDatas = FriendsDataSerializer(many = True) 
    ChatroomDatas = ChatroomDataSerializer(many = True) 
    photo = Base64ImageField(
     max_length=None, use_url=True, 
    ) 
    class Meta: 
     model = UserData 
     fields = ("pk","account","password","username","gender","score", 
       "photo","TaskDatas","FriendsDatas","ChatroomDatas") 
     read_only_fields = ('TaskDatas','FriendsDatas','ChatroomDatas',) 
     depth = 1 

views.py

@api_view(['GET','POST']) 
def jobterm_list(request, format=None): 

    if request.method=="GET": 
     UserDatas =list(UserData.objects.all()) 
     serializer = UserDataSerializer(UserDatas,many=True) 
     return Response(serializer.data) 


    elif request.method == 'POST': 
     serializer = UserDataSerializer(data=request.data) 

     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors,  status=status.HTTP_400_BAD_REQUEST) 



@api_view(['GET', 'PUT', 'DELETE']) # 
def jobterm_detial(request,pk, format=None): 
    try: 
     User_Data = UserData.objects.get(pk=pk) 
    except UserData.DoesNotExist: 
     return Response(status=status.HTTP_404_NOT_FOUND) 

    if request.method == "GET": 
     serializer = UserDataSerializer(User_Data) 
     return Response(serializer.data) 

    elif request.method == "PUT": 
     serializer = UserDataSerializer(User_Data,data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     else: 
      return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) 

    elif request.method == "DELETE": 
     User_Data.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 

答えて

0

最後に、私はそれに応じて、このようなupdate()メソッドを定義してみてください。

def update(self, instance, validated_data): 
    instance.account = validated_data['account'] 
    instance.password = validated_data['password'] 
    instance.username = validated_data['username'] 
    instance.gender = validated_data['gender'] 
    instance.score = validated_data['score'] 
    instance.photo = validated_data['photo'] 

    Friends_Datas = User_Datas.get('FriendsDatas') 
    for friend in Friends_Datas: 
     friendsdatas, _ = FriendsData.objects.update_or_create(
      {'friend_name': friend.get('friend_name')}, 
      friend_account = friend.get('friend_account'), 
      usersData_id = instance) 

    Task_Datas = User_Datas.get('TaskDatas') 
    for task in Task_Datas: 
     taskdatas, _ = TaskData.objects.update_or_create(
      { 
      'task_is_group' : task.get('task_is_group'), 
      'task_time' : task.get('task_time'), 
      'task_score' : task.get('task_score'), 
      'task_member_list' : task.get('task_member_list'), 
      'task_bulletin' : task.get('task_bulletin'), }, 
      task_name = task.get('task_name'), 
      userData_id = instance 
            ) 
     Subtask_Datas = task.get('SubtaskDatas') 
     for subtask in Subtask_Datas: 
      subtaskdatas = SubtaskData.objects.update_or_create(
       {'subtask_deadline' : subtask.get('subtask_deadline'), 
       'subtask_completion' : subtask.get('subtask_completion'), 
       'subtask_importance' : subtask.get('subtask_importance'), 
       'subtask_item' : subtask.get('subtask_item'), } 
       ,subtask_name = subtask.get('subtask_name'), 
       taskData_id = taskdatas     
            ) 


    Chatroom_Datas = User_Datas.get('ChatroomDatas') 
    for chatroom in Chatroom_Datas: 
     chatroomdatas, _ = ChatroomData.objects.update_or_create(
      {'chatroom_contents' : chatroom.get('chatroom_contents'),}, 
      chatroom_member = chatroom.get('chatroom_member'), 
      userdata_cid = instance 
      ) 

    return instance 
関連する問題