django rest API路由显示所有端点的相同api链接

时间:2016-03-07 15:54:08

标签: django django-rest-framework

我创建了一个小型的Task app&定义一些终点,如所有任务,到期任务,完成任务。

这是我的url.py

#Define API Routes
router = routers.DefaultRouter()
#router = routers.SimpleRouter()
router.register(r'task', views.TaskViewSet)
router.register(r'due_task', views.DueTaskViewSet)
router.register(r'completed_task', views.CompletedTaskViewSet)

urlpatterns = [
    # Examples:
    # url(r'^$', 'TaskAPI.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^',include(router.urls)),
    url(r'^admin/', include(admin.site.urls)),
]

Serializers.py

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model =  Task
        fields = ('id','task_name','task_desc','completed','date_created')

View.py

class TaskViewSet(viewsets.ModelViewSet):

    queryset = Task.objects.all().order_by('-date_created')
    serializer_class = TaskSerializer

class DueTaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all().order_by('-date_created').filter(completed=False)
    serializer_class = TaskSerializer

class CompletedTaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all().order_by('-date_created').filter(completed=True)
    serializer_class = TaskSerializer

model.py

class Task(models.Model):
    task_name = models.CharField(max_length=20)
    task_desc = models.TextField(max_length=200)
    completed = models.BooleanField(default=False)
    date_created = models.DateTimeField(auto_now=True)

当我运行服务器&点击127.0.0.1:8080将打开API路径窗口,所有端点都指向同一链接。

enter image description here

请告诉我这里出了什么问题。 感谢

2 个答案:

答案 0 :(得分:12)

您可能需要在base_name方法中指定可选的register()参数。它通常是自动生成的。但是,相同的序列化程序和相对类似的查询集可能是您获得相同端点的原因。我想你想要这样的东西。

router.register(r'task', views.TaskViewSet, 'task')
router.register(r'due_task', views.DueTaskViewSet, 'due_task')
router.register(r'completed_task', views.CompletedTaskViewSet, 'completed_task')

根据docs

  

如果未设置,将根据视图集的queryset属性自动生成基本名称(如果有)。请注意,如果视图集不包含queryset属性,则必须在注册视图集时设置base_name

答案 1 :(得分:1)

你确实混淆了DRF。也许它应该能够处理你的情况,但它不能。

我会使用可选过滤器将所有三个viewsets合并为一个viewset

from rest_framework import filters

class TaskViewSet(viewsets.ModelViewSet):

    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    filter_fields = ('completed',)
    ordering = ('-date_created',)

    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter,)

然后,使用completed参数有条不紊地查询:

/completed_task/
/completed_task/?completed=True
/completed_task/?completed=False