【问题标题】:Django Rest framework nested serializer not returning relation values in validated_dataDjango Rest框架嵌套序列化程序不返回validation_data中的关系值
【发布时间】:2018-02-10 02:17:50
【问题描述】:

我已经正确定义了一切。 (GET 工作正常) 我可以通过嵌套序列化程序获取用户详细信息。但是,当我执行 PUT 时,我没有在 UserSerializer 中的更新方法中获得验证数据。

models.py

class UserProfile(models.Model):

    user = models.ForeignKey(User, related_name='users', 
    on_delete=models.CASCADE)    
    phone_number = models.CharField(max_length=15)
    known_languages = models.CharField(max_length=100)
    date_updated = models.DateTimeField(auto_now=True)     
    user_domain = models.CharField(max_length=100, default=None)

serializers.py

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserProfile
        fields = ['phone_number', 'known_languages', 'user_domain']

class UserSerializer(serializers.ModelSerializer):

    users = UserProfileSerializer()

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'users']

    def update(self, instance, validated_data):
        import pdb;pdb.set_trace()
        #here I am not getting users value. it is returning empty list
        return instance

views.py

def put(self, request, pk):

        user_obj = self.get_object(pk)
        request.POST._mutable = True
        request.data['users'] = { 'phone_number': request.data.pop('phone_number'), 'user_domain': request.data.pop('user_domain'), 'known_languages': request.data.pop('known_languages') }
        request.POST._mutable = False
        serializer = UserSerializer(user_obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

谁能帮忙解决一下……

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:
    data = request.data.dict()
    data['users'] = { 'phone_number': request.data.pop('phone_number'), 'user_domain': request.data.pop('user_domain'), 'known_languages': request.data.pop('known_languages') }
    serializer = UserSerializer(user_obj, data=data, partial=True )
    

    非常适合我

    【讨论】:

      【解决方案2】:

      删除这三行:

      request.POST._mutable = True
      request.data['users'] = { 'phone_number': request.data.pop('phone_number'), 'user_domain': request.data.pop('user_domain'), 'known_languages': request.data.pop('known_languages') }
      request.POST._mutable = False
      

      只在 update 内部使用:

      def update(self, instance, validated_data):
          request = self.context.get('request')
          data = request.data.copy()
          users = {
              'phone_number': data.get('phone_number'),
              'user_domain': data.get('user_domain'),
              'known_languages': data.get('known_languages')
          }
          # your code ...
      

      【讨论】:

      • self.context 在更新方法中返回空字典。无论如何,序列化程序应该返回验证数据。但我没有得到它......你能告诉我为什么我没有得到它吗?@Bear Brown
      • 是因为你使用django class view,尝试使用rest api modelviewset
      猜你喜欢
      • 2017-02-09
      • 2019-12-23
      • 2022-10-14
      • 2021-06-23
      • 2016-05-14
      • 2018-12-13
      • 2015-08-14
      • 2015-05-11
      • 2020-08-05
      相关资源
      最近更新 更多