【问题标题】:Django Rest Framework - Displaying the User's ProfileDjango Rest Framework - 显示用户的个人资料
【发布时间】:2019-09-18 16:50:00
【问题描述】:

我的 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 时,如何加载用户配置文件

非常感谢任何帮助。提前谢谢你。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

    【讨论】:

    • 感谢 JPG。这行得通。有没有办法可以使用 rest_framework 的视图集来实现这一点,而不是使用 APIView?
    • APIView 也属于 DRF 并且我认为这里不需要 viewsets 类,因为您只是在处理使用 HTTP GET 请求
    • @NadunPerera 无论如何,我已经更新了我的答案。希望能帮助到你。并且不要忘记标记和投票答案:)
    • 如何在 urls.py 中注册上述视图集的 URL?
    • 你不需要注册它....就像我说的,它只处理 HTTP GET 请求
    【解决方案2】:

    我使用过 **AbstractUser ** 和 **custom user manager ** 我使用 ViewSets.ViewSet 和模型序列化器

    #urls.py 文件#

    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    from .views import ProfileViewSet, LoginViewSet, RegisterViewSet
    
    router = DefaultRouter()
    router.register(r'register', RegisterViewSet, basename='register')
    router.register(r'login', LoginViewSet, basename='login')
    router.register(r'profile', ProfileViewSet, basename='profile')
    
    urlpatterns = [
    path('', include(router.urls)),
    ]
    

    #views.py 文件#

    from rest_framework.response import Response
    from rest_framework.viewsets import ViewSet
    from .models import user_reg
    from .serializers import RegisterSerializer
    
    
    class ProfileViewSet(ViewSet):
    
        def partial_update(self, request, pk=None):    #partially update the profile
    
            try:
                user_detail = user_reg.objects.get(pk=pk)
               
                serializer = RegisterSerializer(user_detail,data=request.data, partial=True)
    
                if not serializer.is_valid():
                    return Response({'data':'internal server error','message':'error aa gyi'},500)
    
                serializer.save()
    
            except Exception as e:
    
                return Response('some exception occured' + str(e))
    
            return Response('record Updated successfully')
    
        def retrieve(self,request, pk=None):    #get or retrieve the profile from database
    
            queryset = user_reg.objects.get(pk=pk)
        
            serializer_class = RegisterSerializer(queryset)
        
            return Response(serializer_class.data)
    

    #serializer.py 文件#

    from rest_framework import serializers
    from .models import user_reg
    
    class RegisterSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = user_reg
            fields = ('username','first_name','last_name','email')  #custom fields i made 
                                                                     u can change this
    

    #models.py#

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    from django.contrib.auth.models import UserManager
    
    
    
    class user_reg(AbstractUser):
        mobile = models.CharField(max_length=10, blank=True, null=True)
        age = models.IntegerField(null=True,blank=False)
        gender = models.CharField(max_length= 8,blank=True)
        objects = UserManager()
    
        class Meta:
            verbose_name='user'
    

    【讨论】:

      猜你喜欢
      • 2021-09-04
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多