0

我的 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 的 User 模型作为其外键。

对于上述模型,我定义了我的 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

最后在我的 urls.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')),
]

正如我所期望的那样,我的浏览器中的 urls 列表如下所示:

{
    "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/"
}

但我得到的是这样的网址列表: -

{
    "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/"
}

但是,如果我访问以下网址,我没有收到任何错误:-

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

没有出现在 urls 列表中我仍然得到 JSON 格式的过滤学习者列表。

我在这里先向您的帮助表示感谢。

4

2 回答 2

2

Django-rest-framework 的路由器尝试通过其模型/查询集来识别视图集,因为两个视图集都使用相同的模型,所以很可能会混淆。从文档中:

如果未设置 basename 将根据视图集的 queryset 属性自动生成(如果有的话)。请注意,如果视图集不包含查询集属性,则您必须在注册视图集时设置 basename。

尝试向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')
于 2019-02-25T14:06:21.680 回答
2

您需要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')
于 2019-02-25T14:05:15.270 回答