我是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”时获得了这份名单;我也得到了“索引”视图,我没有得到这两个列表的特定实例,而是获得了“索引”视图。
为什么?
答案 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...
)