【问题标题】:How to using django-taggit in DRF如何在 DRF 中使用 django-taggit
【发布时间】:2015-12-12 04:50:27
【问题描述】:

我无法从 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

我收到了这个错误:

'module'对象没有属性'WritableField

显然 WritableField 已被弃用。

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

【问题讨论】:

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


【解决方案1】:

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

serializers.py

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

    def to_representation(self, data):
        return list(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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多