Преобразовать URL объекта в его экземпляр базы данных - PullRequest
0 голосов
/ 07 сентября 2018

Я создал дополнительную функцию в своем представлении, которая получает список с гиперссылками на некоторые объекты 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/", ...]}

ResourceSerializer:

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

ResourceGroupSerializer:

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 Ответ

0 голосов
/ 07 сентября 2018

используйте 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- гиперссылка, родственное поле

...