Django rest 框架扩展用户配置文件

Posted

技术标签:

【中文标题】Django rest 框架扩展用户配置文件【英文标题】:Django rest framework extended user profile 【发布时间】:2016-07-29 11:02:12 【问题描述】:

我最近发现了 DRF,但我对视图、视图集和其他可能性的数量感到迷茫。

我有一个带有扩展用户配置文件的 Python3/Django 1.8 应用程序:

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _


class Profile(models.Model):
    GENDER = (
        ('male', _('MALE')),
        ('female', _('FEMALE')),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.CharField(default='', max_length=500, null=True, blank=True)
    gender = models.CharField(max_length=10, choices=GENDER, null=True, blank=True)
    city = models.CharField(default='', max_length=30, null=True, blank=True)
    country = models.CharField(default='', max_length=30, null=True, blank=True)

我希望允许与 oauth2/token Bearer 连接的外部移动应用程序通过 api获取当前连接用户的个人资料并使用这些路由对其进行编辑: p>

GET 或 PUT /api/profile GET 或 PUT /api/user

我的第一个意图是只使用一个路由来操作两个模型(通过 /api/profile),但我失败了,我不确定在一个路由后面混合两个模型是否是一个好习惯。

我尝试了很多东西。我最后一次尝试是这样获取个人资料:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'email', 'groups')

    password = serializers.CharField(write_only=True)


class UserViewSet(viewsets.ModelViewSet):
    @list_route(methods=['get', 'post'], permission_classes=[permissions.IsAuthenticated])
    def profile(self, request):
        u = User.objects.filter(pk=request.user.pk)[0]
        p = Profile.objects.filter(user=u)[0]
        return Response("id": u.id, "first_name": u.first_name, "last_name": u.last_name, "email": u.email,
                     "city": p.city, "country": p.country, "bio": p.bio)

    permission_classes = [permissions.IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer


router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

问题是:我未能尝试为 PUT 请求实现相同的操作。此外,我想在 API 端做安全和防御编码部分,在这种情况下,我什至不使用序列化程序。

你们能帮我找到正确的事情吗?您有什么建议、建议吗?

干杯

【问题讨论】:

您在为配置文件创建视图集时遇到了什么问题? Swagger 没有显示任何表单字段,因为我没有找到如何手动使用序列化程序,我不得不手动检查用户数据。我想将安全检查委托给序列化程序。 【参考方案1】:

我想这就是你想要的:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('bio', 'gender', 'city', 'country')


class UserSerializer(serializers.ModelSerializer):

    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'email', 'groups', 'profile')

或者如果你想要它平坦:

class UserSerializer(serializers.ModelSerializer):

    bio = serializers.CharField(source='profile.bio')
    gender = serializers.CharField(source='profile.gender')
    #same for the others

    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'email', 'groups', 'bio', 'gender')

我没有测试它,但应该接近你想要的,或者至少接近它。

【讨论】:

确实很接近了,谢谢!但我想只授权 GET 和 PUT 请求并自动选择当前用户。 POST /user/profile(修改当前用户配置文件模型) GET /user/profile(修改当前用户模型) 哇,这太简单了,我已经找了好几天了。我是 DRF 的新手。谢谢!

以上是关于Django rest 框架扩展用户配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Django REST 框架:使用相关字段创建/更新对象

为啥通过 django rest 框架注册用户时出现状态码错误

扩展 django 用户 django-rest_framework 给了我 KeyError

django rest framework jwt 使用电子邮件和密码进行身份验证

Django rest框架:防止一个用户删除/编辑/查看ModelViewSet中的其他用户

Angular 2 前端 django 2 REST 框架后端用户身份验证