Django Rest Framework - Отображение профиля пользователя - PullRequest
0 голосов
/ 30 апреля 2019
Файл

My 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__'

Мои пользователи / api.py выглядят как показано ниже.

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

My 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/ отображает пользователя в соответствии с идентификатором.

У меня вопрос, как я могу загрузить профиль пользователя, когда я иду по нижеуказанному URL-адресу http://127.0.0.1:8000/api/users/1/profile

Любая помощь очень ценится. Заранее спасибо.

1 Ответ

1 голос
/ 30 апреля 2019

Создайте новый сериализатор для 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())
]

Update-1

Реализация с использованием ViewSet класс

<b>from rest_framework import viewsets</b>
from rest_framework.response import Response
from django.shortcuts import get_object_or_404


class ProfileAPI(<b>viewsets.ViewSet</b>):
    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)

Update-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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...