如何在 DRF 中使用 django-taggit

dev*_*jim 1 django serialization django-taggit django-rest-framework

我无法从 django-taggit 序列化标签。我遵循了here的说明,但它已经过时了。

这是我所做的:

视图.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
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

'module' 对象没有属性 'WritableField

显然 WritableField 已被弃用。

我正在使用 django 1.8、DRF 3.2 和 django-taggit-0.17。

Pie*_*man 7

我将使用 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
Run Code Online (Sandbox Code Playgroud)

或者您可以在视图中使用 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'])
Run Code Online (Sandbox Code Playgroud)