Как использовать django-taggit в DRF

У меня возникли проблемы с сериализацией тегов из django-taggit. Я следовал инструкциям из здесь, но он устарел.

Вот что я сделал:

просмотры.py

class TagsSerializer(serializers.WritableField):

    def from_native(self, data):
        if type(data) is not list:
            raise ParseError("expected a list of data")
        return data

    def to_native(self, obj):
        if type(obj) is not list:
            return [tag.name for tag in obj.all()]
        return obj

Я получил эту ошибку:

Объект «модуль» не имеет атрибута «WritableField».

По-видимому, WritableField устарел.

Я использую django 1.8, DRF 3.2 и django-taggit-0.17.


person dev-jim    schedule 15.09.2015    source источник
comment
Вот библиотека, которую вы можете использовать: github.com/glemmaPaul/django-taggit-serializer. . Для DRF › 3.0 вы можете использовать сериализаторы.ListField.   -  person Pieter Hamman    schedule 16.09.2015
comment
@dev-jim в DRF 3.2 нет полей для записи. Можете ли вы перейти по этой ссылке django-rest-framework.org/ api-guide/fields/#composite-fields   -  person Seenu S    schedule 16.09.2015


Ответы (1)


Я бы использовал TaggableManager для обновления тегов с пользовательским ListField для обработки сериализации тегов. Затем вы можете использовать методы создания/обновления сериализатора для установки тегов.

сериализаторы.py

class TagSerializerField(serializers.ListField):
    child = serializers.CharField()

    def to_representation(self, data):
        return data.values_list('name', flat=True)

class TagSerializer(serializers.ModelSerializer):
    tags = TagSerializerField()

    def create(self, validated_data):
        tags = validated_data.pop('tags')
        instance = super(TagSerializer, self).create(validated_data)
        instance.tags.set(*tags)
        return instance

или вы можете использовать хуки Perform_create/perform_update в представлении.

просмотры.py

class TagView(APIView):
    queryset = Tag.objects.all()
    serializer_class = TagSerializer

    def perform_create(self, serializer):
        instance = serializer.save()
        if 'tags' in self.request.DATA:
            instance.tags.set(*self.request.DATA['tags'])
person Pieter Hamman    schedule 16.09.2015