Django REST路由器

时间:2016-06-24 14:43:45

标签: django-rest-framework django-urls

我是Django REST的新手,我正在努力理解它背后的概念 我已经设置了以下API

serializers.py

class StudentSerializer(serializers.ModelSerializer):   
    class Meta:
        model = Student
        fields = ('classroom', 'first_name', 'last_name', 'gender', 'birthday')

class ClassroomSerializer(serializers.ModelSerializer):
    students = StudentSerializer(many=True)

    class Meta:
        model = Classroom
        depth = 1
        fields = ('school', 'academic_year', 'classroom', 'floor', 'students')

views.py

def index(request):
    return render_to_response('school_app/base.html', RequestContext(request))

class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

class ClassroomViewSet(viewsets.ModelViewSet):
    queryset = Classroom.objects.all()
    serializer_class = ClassroomSerializer

urls.py

router = routers.SimpleRouter()

router.register(r'classrooms', ClassroomViewSet)
router.register(r'students', StudentViewSet)

urlpatterns = router.urls

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^classrooms/$', school_app.views.ClassroomViewSet.as_view({'get': 'list'}), name='classroom-list'),
    url(r'^students/$', school_app.views.StudentViewSet.as_view({'get': 'list'}), name='student-list'),
    url(r'^students/(?P<pk>[^/.]+)/$', school_app.views.StudentViewSet.as_view({'get': 'list'}), name='student-list'),
    url(r'^', 'school_app.views.index', name='index-page'),
    #url(r'^', include(router.urls)),
]

我无法理解一件事。如果我像这样写urls.py

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^', include(router.urls)),
]

当我去“/ classesrooms /”或“/ students /”时,我可以看到两个列表(学生和教室),当点击时,例如“/ students / 1”,我得到了那个特定的学生实例 - 但是“索引”视图不起作用。

当urls.py写得像这样

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^classrooms/$', school_app.views.ClassroomViewSet.as_view({'get': 'list'}), name='classroom-list'),
    url(r'^students/$', school_app.views.StudentViewSet.as_view({'get': 'list'}), name='student-list'),
    url(r'^students/(?P<pk>[^/.]+)/$', school_app.views.StudentViewSet.as_view({'get': 'list'}), name='student-list'),
    url(r'^', 'school_app.views.index', name='index-page'),
]

我在去“/ classrooms /”或“/ students”时获得了这份名单;我也得到了“索引”视图,我没有得到这两个列表的特定实例,而是获得了“索引”视图。

为什么?

1 个答案:

答案 0 :(得分:0)

您手动完成这项工作。使用DRF DefaultRouter并让它处理实例/列表细节。

from rest_framework import routers

router = routers.DefaultRouter()

router.register('classrooms', school_app.views.ClassroomViewSet)
router.register('students', school_app.views.StudentViewSet)

urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    # ... other urls...
)