首页 > 解决方案 > Django Rest Framework - 显示用户的个人资料

问题描述

我的users/models.py文件如下所示。

class User(AbstractUser):
    is_customer = models.BooleanField(default=False)
    is_courier = models.BooleanField(default=False)
    is_merchant = models.BooleanField(default=False)


class Profile(models.Model):
    contact_number = models.CharField(max_length=10, unique=True)
    rating = models.IntegerField(blank=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    user = models.ForeignKey(User, on_delete=models.CASCADE)

我当前的users/serializers.py如下所示。

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

我的users/api.py如下所示。

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    permission_classes = [
        permissions.AllowAny
    ]
    serializer_class = UserSerializer

我的users/urls.py有以下内容:

router.register('api/users', UserViewSet, 'users')

我当前的设置适用于 UserViewSet。http://127.0.0.1:8000/api/users/显示所有用户, http: //127.0.0.1 :8000/api/users/1/根据ID显示用户。

我的问题是,当我转到以下 URL http://127.0.0.1:8000/api/users/1/profile时,如何加载用户配置文件

任何帮助深表感谢。先感谢您。

标签: pythondjangodjango-rest-framework

解决方案


Profile为模型创建一个新的序列化程序

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = "__all__"

然后为Profile.

from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import get_object_or_404


class ProfileAPI(APIView):
    def get(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=kwargs['user_id'])
        profile_serializer = ProfileSerializer(user.profile)
        return Response(profile_serializer.data)

然后,将视图连接到urls.py

urlpatterns = [
    # your other url configs
    path('api/users/<user_id>/profile/', ProfileAPI.as_view())
]

更新 1

使用ViewSet类实现

from rest_framework import viewsets
from rest_framework.response import Response
from django.shortcuts import get_object_or_404


class ProfileAPI(viewsets.ViewSet):
    def get(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=kwargs['user_id'])
        profile_serializer = ProfileSerializer(user.profile)
        return Response(profile_serializer.data)

更新 2

from rest_framework import viewsets


class ProfileAPI(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer

    def get_queryset(self):
        return Profile.objects.filter(user=self.kwargs['user_id'])

并在您urls.py将视图集注册为

router.register('api/users/(?P<user_id>\d+)/profile', ProfileAPI, base_name='profile_api')

推荐阅读