首页 > 解决方案 > DRF:如何使用视图集中的操作装饰设置正确的 view_name

问题描述

我有下一个动作装饰器方法,我假装在模型上过滤老师:

@action(detail=True, methods=(['GET']))
def get_teachers_by_area(self, request, pk=None):
    teachers = self.get_serializer().Meta.model.objects.get_teachers_by_area(pk=pk)
    if teachers:
        teacher_serializer = TeacherByAreaListSerializer(teachers, many=True)

        return Response(
            {
                'ok': True,
                'conon_data': teacher_serializer.data
            },
            status=status.HTTP_200_OK
        )
    else:
        return Response(
            {
                'ok': False,
                'detail': 'No se encontró el Área de Conocimiento.'
            },
            status=status.HTTP_400_BAD_REQUEST
        )

接下来是网址的文件:

路由器.py

router = routers.DefaultRouter()

router.register(
    r'school-period',
    SchoolPeriodViewSet,
    basename='school_period'
)
router.register(
    r'knowledge-area',
    KnowledgeAreaViewSet,
    basename='knowledge_area')

urlpatterns = router.urls

网址.py

path('user/api/', include('applications.users.routers')),
path('school/api/', include('applications.school.routers')),

接下来是模型的 Serializers.py:

class KnowledgeAreaSerializer(serializers.HyperlinkedModelSerializer):

teachers = serializers.HyperlinkedRelatedField(
    view_name='knowledge_area-detail',
    read_only=True,
)

我只是假装用前面提到的动作装饰器像 url 一样返回数据(教师):

    def to_representation(self, instance):

    data = super().to_representation(instance)

    return {
        'id': instance.id,
        'name': instance.name,
        'coordinator': {
            'id': instance.coordinator.person.id,
            'name': instance.coordinator.person.full_name()
        },
        'sub_coordinator': {
            'id': instance.sub_coordinator.person.id,
            'name': instance.sub_coordinator.person.full_name()
        },
        'objective': instance.objective,
        'observations': instance.observations,
        'teachers': instance.teachers,
        'created_at': instance.created_at
    }

但问题是我无法指出动作方法的正确 URL,我做了很多研究,但没有找到任何关于它或具有相同要求的东西。谢谢你顺便帮我。

标签: pythondjangodjango-rest-framework

解决方案


推荐阅读