使用 Django-taggit 和 Django-taggit-serializer 有问题

Using Django-taggit and django-taggit-serializer with issue

我正在尝试通过 taggit 和 taggit 序列化程序在我的模型中添加标签。我在休息框架中制作 API。 我按照说明做了(https://github.com/glemmaPaul/django-taggit-serializer),但还是有问题:

"tags": [ "Invalid json list. A tag list submitted in string form must be valid json."]

/setting.py

INSTALLED_APPS = [
  [...]
'rest_framework',
'taggit',
'taggit_serializer',
]

/models.py

tags = TaggableManager(blank = True) 

/serializer.py

class JobSerializer(TaggitSerializer,serializers.HyperlinkedModelSerializer):

# tag serializer
tags = TagListSerializerField()

view.py 中的注意事项发生了变化。

感谢@ykh 帮我解决了这个问题,但是遇到了新的情况,报错了:

当你想初始化值时:

hao,free

结果会是这样:

 "tags": [
    "hao",
    "free"
],

但是当我打算将更新放入这个值时: 它自动在 rest 框架中显示 Json 文件:

如果您将数据放入 api,结果将是:

问题是,每次当我尝试修改包含 'tag' 的 rest 框架实例时,括号和换行符都会自动添加到 'tag' 字段中,如图片结果显示


更新: 看来我已经解决了这个问题,解决方案是覆盖序列化程序中的创建函数:

using django-taggit-serializer. and

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

尝试:

import six

class NewTagListSerializerField(TagListSerializerField):
    def to_internal_value(self, value):
        if isinstance(value, six.string_types):
            value = value.split(',')

        if not isinstance(value, list):
            self.fail('not_a_list', input_type=type(value).__name__)

        for s in value:
            if not isinstance(s, six.string_types):
                self.fail('not_a_str')

            self.child.run_validation(s)
        return value

class JobSerializer(TaggitSerializer,serializers.HyperlinkedModelSerializer):

    tags = NewTagListSerializerField()

post 带有“tags1,tags2”的标签

原源码为:

def to_internal_value(self, value):
    if isinstance(value, six.string_types):
        if not value:
            value = "[]"
        try:
            value = json.loads(value)
        except ValueError:
            self.fail('invalid_json')

    if not isinstance(value, list):
        self.fail('not_a_list', input_type=type(value).__name__)

    for s in value:
        if not isinstance(s, six.string_types):
            self.fail('not_a_str')

        self.child.run_validation(s)

    return value

错误是由于 json.loads(value) 不成功,我不知道排除了哪种数据类型。

更正上面的答案,因为 Ykh 的解决方案不正确,当我想以 JSON 格式更新我的标签时(我得到 \r \m \ 符号)

import json

class NewTagListSerializerField(TagListSerializerField):
    def to_internal_value(self, value):
        if isinstance(value, six.string_types):
            if not value:
                value = "[]"
            try:
                if(type(value) == str):
                    if(value.__contains__('"') == True):
                        value = json.loads(value)
                    else:
                        value = value.split(',')

            except ValueError:
                self.fail('invalid_json')

        if not isinstance(value, list):
            self.fail('not_a_list', input_type=type(value).__name__)

        for s in value:
            if not isinstance(s, six.string_types):
                self.fail('not_a_str')

            self.child.run_validation(s)

        return value