代码之家  ›  专栏  ›  技术社区  ›  Tavy

将对象的URL转换为其数据库实例

  •  0
  • Tavy  · 技术社区  · 8 年前

    class ResourceViewSet(viewsets.ModelViewSet):
        queryset = Resource.objects.all()
        serializer_class = ResourceSerializer
    
        @action(methods=['put'], detail=True)
        def groups_append(self, request, pk=None):
            instance = self.get_object()
            groups = request.data.get("groups")
            for resource_group in groups:
                instance.groups.add(WHAT_HERE(resource_group))
            instance.save()
            return Response(self.get_serializer(instance, many=False).data)
    

    请求如下:

    PUT    http://.../api/resources/1/groups_append/
    

    带主体:

    {"groups": ["http://.../api/resource_groups/1/", ...]}
    

    资源序列化程序:

    class ResourceSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Resource
            fields = ('resource_id', 'object_id', 'type', 'system', 'path', 'groups', 'job_set')
    
        def update(self, instance, validated_data):
            instance.object_id = validated_data.get('object_id', instance.object_id)
            instance.type = validated_data.get('type', instance.type)
            instance.system = validated_data.get('system', instance.system)
            instance.path = validated_data.get('path', instance.path)
            instance.save()
            return instance
    

    资源组序列化程序:

    class ResourceGroupSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = ResourceGroup
            fields = ('resource_group_id', 'label', 'resource_set')
    
        def update(self, instance, validated_data):
            instance.label = validated_data.get('label', instance.label)
            instance.save()
            return instance
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Ehsan Nouri    8 年前

    使用 HyperlinkedRelatedField 对于中的组 ResourceSerializer 或者只是为此操作创建一个新的序列化程序(主要思想是使用序列化程序而不是直接从请求体获取数据),如下所示:

    class ResourceSerializer(serializers.HyperlinkedModelSerializer):
    
        groups = serializers.HyperlinkedRelatedField(
            many=True,
            read_only=True,
            view_name='groups-detail' ## name of the groups detail url
        )
        class Meta:
            model = Resource
        ....
    

    @action(methods=['put'], detail=True)
    def groups_append(self, request, pk=None):
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        ### then get the groups from the validated data
        groups = serializer.validated_data.get('groups', [])
        ....
        ....
    

    参考文献:

    1- hyperlinkedrelatedfield

    推荐文章