Django Rest Framework urls.py запутался - PullRequest
0 голосов
/ 25 февраля 2019

Мой файл models.py определен следующим образом: -

from django.db import models
from django.contrib.auth.models import User

class Custom_User(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    mobile = models.CharField(max_length=20)
    REGISTRATION_CHOICES = (
        ('Learner', 'Learner'),
        ('Trainer', 'Trainer'),
    )
    primary_registration_type = models.CharField(max_length=15, choices=REGISTRATION_CHOICES)    

    def __str__(self):
        return self.user.email

Как вы можете видеть, моя модель Custom_User использует модель пользователя Django в качестве внешнего ключа.

ДляПриведенная выше модель Я определил свой файл serialziers.py следующим образом: -

from django.contrib.auth.models import User
from rest_framework import serializers
from .models import *

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


class Custom_UserSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Custom_User
        fields = ('__all__')

Теперь я использую этот сериализатор в своих наборах, как показано ниже: -

from django.contrib.auth.models import User
from rest_framework import viewsets
from .serializers import *


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer



class Custom_UserViewSet(viewsets.ModelViewSet):
    queryset = Custom_User.objects.all()
    serializer_class = Custom_UserSerializer



class TrainerViewSet(viewsets.ModelViewSet):
    queryset = Custom_User.objects.filter(primary_registration_type="Trainer")
    serializer_class = Custom_UserSerializer


class LearnerViewSet(viewsets.ModelViewSet):
    queryset = Custom_User.objects.filter(primary_registration_type="Learner")
    serializer_class = Custom_UserSerializer

И, наконец, внутри моих URL.py файл Я регистрирую их, как показано ниже: -

from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'users', api_mailing_list_views.UserViewSet)
router.register(r'custom_users', api_mailing_list_views.Custom_UserViewSet)
router.register(r'trainers', api_mailing_list_views.TrainerViewSet)
router.register(r'learners', api_mailing_list_views.LearnerViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', mailing_list_views.index, name='index'),
    path('api/', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

Как я и ожидал, список URL-адресов в моем браузере будет выглядеть примерно так:

{
    "users": "http://localhost:8080/api/users/",
    "custom_users": "http://localhost:8080/api/custom_users/",
    "trainers": "http://localhost:8080/api/trainers/",
    "learners": "http://localhost:8080/api/learners/"
}

Но вместо этого я получаюсписок URL-адресов, таких как: -

{
    "users": "http://localhost:8080/api/users/",
    "custom_users": "http://localhost:8080/api/trainers/",
    "trainers": "http://localhost:8080/api/trainers/",
    "learners": "http://localhost:8080/api/trainers/"
}

Однако я не получаю никаких ошибок или посещаю следующий URL-адрес: -

http://localhost:8080/api/learners/

, который не отображается в списке URL-адресовЯ все еще получаю отфильтрованный список учеников в формате JSON.

Спасибо за помощь заранее.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Маршрутизатор Django-rest-framework пытается идентифицировать набор по его модели / набору запросов, так как оба набора используют одну и ту же модель, что, скорее всего, запутывается.Из документации :

Если не установлено, базовое имя будет автоматически сгенерировано на основе атрибута набора запросов в наборе, если таковое имеется.Обратите внимание, что если набор представлений не включает атрибут набора запросов, то при регистрации набора вы должны установить базовое имя.

Попробуйте предоставить basename маршрутизатору:

router.register(r'custom_users', api_mailing_list_views.Custom_UserViewSet, basename='custom_users')
router.register(r'trainers', api_mailing_list_views.TrainerViewSet, basename='trainers')
router.register(r'learners', api_mailing_list_views.LearnerViewSet, basename='learners')
0 голосов
/ 25 февраля 2019

вам нужно указать basename во время регистрации маршрутизатора, поскольку все они на самом деле из одной custom_user модели.

router = routers.DefaultRouter()
router.register(r'users', api_mailing_list_views.UserViewSet, basename='users')
router.register(r'custom_users', api_mailing_list_views.Custom_UserViewSet, basename='custom_user')
router.register(r'trainers', api_mailing_list_views.TrainerViewSet, basename='trainers')
router.register(r'learners', api_mailing_list_views.LearnerViewSet, basename='learners')
...