我正在使用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,因此当我注册用户时,我也可以以原子方式插入该组。在这种情况下,最好的方法是什么?我曾试图与其他领域类型玩,但直到现在都没有成功。 目前我发送两个单独的帖子(一个用户和一个用户用户档案,但我打赌有更好的方式......)
答案 0 :(得分:0)
您可以采用两种常规方法:更新post_save()
中的相关字段或使用两个序列化程序,并在处理请求之前要求两者都有效。
答案 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)