2017-04-23 12 views
0

デフォルトのDjangoユーザモデルを拡張して、追加のフィールドを持つカスタマイズされたユーザプロファイルを作成しました。以下は、関連するコンポーネントです。私はsucccessfully作成したDjango Rest Framework:拡張ユーザモデルとシリアライゼーションの問題

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) 

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ユーザープロファイルだけでなく、私は次のように同じことを行う上でエラーをencouteringてるprofile.But拡張候補:

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、関連候補プロファイルが作成されていてもして。

答えて

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 
関連する問題