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

标签 django rest python-3.x django-rest-framework

我最近发现了 DRF,并且对 View 、 View 集和其他可能性的数量感到迷惑。

我有一个带有扩展用户配置文件的 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 和 编辑 使用这些路线:

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 端进行安全和防御性编码部分,在这种情况下,我什至不使用序列化程序。

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

干杯

最佳答案

我认为这就是你想要的:

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')

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

关于Django rest 框架扩展用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36495240/

相关文章:

python - 计算 Django ORM 中按查询分组的注释字段的最大总和?

django - S3 不向 Django heroku 应用程序提供媒体文件

json - Elasticsearch 中的映射和查询

python - 导入错误 : cannot import name 'generate_password_hash'

python - 在 setup.py (distutils.extension) 中更改输出文件名

python - object() 不带参数

django - 在 Django 的 ImageField 中使用 height_field 和 width_field 属性

java - 如何在我的 Web 应用程序中实现 REST。我想为我的网站制作一个休息 API?

azure - OAuth 2.0 {"error_description":"Invalid issuer or signature."} 在 postman 中

python - 将带有日期和时区的字符串解析为 UTC 日期时间