【问题标题】:Django Rest Framework: Issue with extended User model and serializationDjango Rest Framework:扩展用户模型和序列化问题
【发布时间】:2017-04-23 04:47:19
【问题描述】:

我扩展了默认的 Django 用户模型,以制作带有附加字段的自定义用户配置文件。以下是相关组件。

models.py

class CandidateProfile(models.Model):
user = models.OneToOneField(
    User, on_delete=models.CASCADE, related_name="user")
exp = models.IntegerField(null=True, blank=True)

serilaizers.py

class CandidateProfileSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(source='pk', read_only=True)
    username = serializers.CharField(source='user.username')
    email = serializers.CharField(source='user.email')
    groups = serializers.RelatedField(read_only=True)
    password = serializers.CharField(max_length=128, source='user.password,read_only=True')

    class Meta:
        model = CandidateProfile
        fields = ('id', 'username', 'password', 'email', 'groups')
        depth = 1

    def update(self, instance, validated_data):
        print("In Update" + '*' * 50)
        user = User.objects.get(pk=instance.user.pk)
        user = instance.user
        user.email = validated_data.get('user.email', user.email)
        user.first_name = validated_data.get('user.first_name',
                                         user.first_name)
        user.last_name = validated_data.get('user.last_name', user.last_name)
        user.save()

        instance.gender = validated_data.get('gender', instance.gender)
        instance.save()

        return instance

    def create(self, validated_data):
        print('*' * 100)
        print(validated_data)
        user_data = validated_data.pop('user')
        print(user_data)
        user = User.objects.create_user(**user_data)
        g = Group.objects.get(name="Candidate")
        g.user_set.add(user)
        user.save()
        print(validated_data)
        print('*' * 100)
        profile = CandidateProfile.objects.create(user=user, **validated_data)
        return user

views.py

class CandidateRegister(APIView):
    def get(self, request, format=None):
        candidate_list = User.objects.filter(groups=Group.objects.get(
            name="Candidate"))
        serializer = CandidateProfileSerializer(candidate_list, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = CandidateProfileSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我已经成功创建了用户个人资料以及扩展的候选人个人资料。但是我在执行以下操作时遇到错误:

Got AttributeError when attempting to get a value for field `username` on serializer `CandidateProfileSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'CandidateProfile' object has no attribute 'username'.

即使使用此 execpiton,也会创建用户个人资料和相关的候选人个人资料。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以使用docs 中的SerializerMethodField 喜欢-

    class CandidateProfileSerializer(serializers.ModelSerializer):
        id = serializers.IntegerField(source='pk', read_only=True)
        username = serializers.SerializerMethodField()
    
        def get_username(self, obj):
            return obj.user.username
    

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2019-06-02
      • 1970-01-01
      • 2018-11-21
      • 2013-11-27
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多