【问题标题】:How to use hyperlinkedModelSerializer in django rest framework如何在 django rest 框架中使用 hyperlinkedModelSerializer
【发布时间】:2020-10-22 04:58:26
【问题描述】:

如何在 django rest framework 中使用 hyperlinkedModelSerializer 我的输出显示:

HyperlinkedRelatedField 需要序列化程序上下文中的请求。实例化序列化器时添加context={'request': request}

代码如下:

serailizers.py

#Program Serializer

class ProgramSerializer(serializers.ModelSerializer):
    class Meta:
        model = Program
        fields = '__all__'

#Program MiniSerializer

class ProgramMiniSerializer(serializers.HyperlinkedModelSerializer):

 programCode = serializers.HyperlinkedRelatedField(many=True,view_name='program-detail', read_only=True)

    class Meta:
        model = Program
        fields = ('programCode', 'pro_name', 'url', 'DepartmentID')

viewsets.py

class ProgramViewSet(viewsets.ModelViewSet):
    queryset = Program.objects.all()
    serializer_class = ProgramSerializer
    filterset_class = ProgramFilter
    filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
    __basic_fields = ( 'programCode', 'pro_name','pro_shortForm', 'DepartmentID')
    filter_backends = (filters.DjangoFilterBackend, SearchFilter, OrderingFilter)
    filter_fields = ('programCode', 'DepartmentID')
    search_fields = ('DepartmentID')
    

    def list(self, request,  *args, **kwargs):
        programs = Program.objects.all()   
        serializer = ProgramMiniSerializer(programs, many=True)
        return Response(serializer.data)

    def get_queryset(self): 
        programs = Program.objects.all()
        return programs

    def retrieve(self, request,  *args, **kwargs):
        params=kwargs
        print(params['pk'])
        # programs = Program.objects.all()
        programs = Program.objects.filter(DepartmentID = params['pk'])
        serializer = ProgramMiniSerializer(programs, many=True)
        return Response(serializer.data)

【问题讨论】:

  • 能否请您在使用 ProgramMiniSerializer 的地方添加视图?
  • 是的,我已经添加了使用 ProgramMiniSerializer 的 viewset.py 文件

标签: django filter django-rest-framework


【解决方案1】:

在初始化序列化程序的listretrieve 方法中,您需要将上下文传递给它,如下所示:

serializer = ProgramMiniSerializer(
    programs, 
    many=True, 
    context={
        'request': request,
    },
)

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 2016-05-28
    • 2017-06-23
    • 2021-12-28
    • 2018-04-08
    • 2021-12-05
    • 1970-01-01
    • 2017-02-22
    • 2020-12-01
    相关资源
    最近更新 更多