首页 > 解决方案 > 将对象的 URL 转换为其数据库实例

问题描述

我在我的视图中创建了一个额外的函数,它接收一个包含对某些 ResourceGroup 对象的超链接引用的列表,但我不知道如何将它们转换为数据库实例

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

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


用于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-超链接相关字段


推荐阅读