繁体   English   中英

如何在DRF中使用django-taggit

[英]How to using django-taggit in DRF

我无法从django-taggit序列化标签。 我遵循了这里的指示,但是已经过时了。

这是我所做的:

views.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。

我将使用TaggableManager更新标签,并使用自定义ListField来处理标签的序列化。 然后,您可以使用序列化程序的创建/更新方法来设置标签。

serializers.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挂钩。

views.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'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM