如何在DRF中使用django-taggit

时间:2015-09-15 19:46:42

标签: django serialization django-rest-framework django-taggit

我无法从django-taggit序列化标签。 我按照here的说明进行了操作,但它已经过时了。

这是我做的:

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

我收到了这个错误:

  

'模块' object没有属性' WritableField

显然不推荐使用WritableField。

我使用的是django 1.8,DRF 3.2和django-taggit-0.17。

1 个答案:

答案 0 :(得分:4)

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

serializers.py

try:
    n = int(input('Please input an integer : '))
except:
    print('Problem with input, using ten instead.')
    n = 10
if n > 1:
    edge = '*' * n
    mid = '*%s*' % (' ' * (n-2))
    print(edge)
    for i in range(n-2): print(mid)
    print(edge)
else:
    print('Needs to be two or more')

或者您可以在视图中使用perform_create / perform_update挂钩。

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