通过POST请求注册扩展用户

时间:2013-10-23 16:54:23

标签: django django-rest-framework

我正在使用Django v1.7dev和Django Rest Framework v2.3

我已按如下方式扩展用户类:

class UserProfile(models.Model):
   user = models.OneToOneField(User)
   gang = models.ForeignKey('Gang', related_name='gangsters')

   def __unicode__(self):
       return self.user.username

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

我还创建了一个用户序列化程序端点(在我发送GET请求时不显示密码,但在发送帖子时接受它,目的是将其用于注册:

class UserSerializer(serializers.ModelSerializer):

class Meta:
    model = User
    fields = ('id', 'username', 'password', 'email')


def restore_object(self, attrs, instance=None):
    user = super(UserSerializer, self).restore_object(attrs, instance)
    user.set_password(attrs['password'])
    return user

def to_native(self, obj):
    ret = super(UserSerializer, self).to_native(obj)
    del ret['password']
    return ret

我想扩展序列化程序以包含gang参数。类似于

的东西
gang = serializers.Field(source='profile.gang')

但是可写而不是ReadOnly,因此当我注册用户时,我也可以以原子方式插入该组。在这种情况下,最好的方法是什么?我曾试图与其他领域类型玩,但直到现在都没有成功。 目前我发送两个单独的帖子(一个用户和一个用户用户档案,但我打赌有更好的方式......)

2 个答案:

答案 0 :(得分:0)

您可以采用两种常规方法:更新post_save()中的相关字段或使用两个序列化程序,并在处理请求之前要求两者都有效。

Check out this question for more details on both

答案 1 :(得分:0)

这是我最终采用的解决方案,基于Carlton的链接问题(但由于用户需要为登录进行身份验证而进行了一些更改,但在注册期间无法进行身份验证:

class UserAuthView(APIView):

#Login. Returns the current user.
def get(self, request, *args, **kwargs):
    # Only UserProfileSerializer is required to serialize data
    if (request.user.is_authenticated()):
        serializer = UserProfileSerializer(
                instance=request.user.profile)
        return Response(serializer.data, status=status.HTTP_200_OK)

    return Response(status=status.HTTP_401_UNAUTHORIZED)


#Register new user.
def post(self, request, format=None):
    user_serializer = UserSerializer(data=request.DATA)
    errors = dict()
    if user_serializer.is_valid():
        user =user_serializer.save()
        data = request.DATA.copy()
        data['user'] = User.objects.latest('id').id
        user_profile_serializer = UserProfileSerializer(data=data)

        if user_profile_serializer.is_valid():
            user_profile_serializer.save()
            return Response(user_profile_serializer.data, status=status.HTTP_201_CREATED)

        errors.update(user_profile_serializer.errors)
        return Response(errors, status=status.HTTP_400_BAD_REQUEST)


    errors.update(user_serializer.errors)
    return Response(errors, status=status.HTTP_400_BAD_REQUEST)