使用带有问题的Django taggit和Django taggit序列化程序

使用带有问题的Django taggit和Django taggit序列化程序,django,django-rest-framework,django-taggit,Django,Django Rest Framework,Django Taggit,我试图通过taggit和taggit序列化程序在我的模型中添加标记。我在rest框架中制作API。 我遵循了说明(),但它仍然是一个问题: “标签”:[ “无效的json列表。以字符串形式提交的标记列表必须是有效的json。”] /setting.py INSTALLED_APPS = [ [...] 'rest_framework', 'taggit', 'taggit_serializer', ] /models.py tags = TaggableManager(blank = Tr

我试图通过taggit和taggit序列化程序在我的模型中添加标记。我在rest框架中制作API。 我遵循了说明(),但它仍然是一个问题:

“标签”:[ “无效的json列表。以字符串形式提交的标记列表必须是有效的json。”]

/setting.py

INSTALLED_APPS = [
  [...]
'rest_framework',
'taggit',
'taggit_serializer',
]
/models.py

tags = TaggableManager(blank = True) 
/序列化程序.py

class JobSerializer(TaggitSerializer,serializers.HyperlinkedModelSerializer):

# tag serializer
tags = TagListSerializerField()
view.py中没有任何更改

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

当您要初始化该值时:

hao,free
结果是:

 "tags": [
    "hao",
    "free"
],
但是当我打算更新此值时: 它自动在rest framework中显示Json文件:

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

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


更新: 似乎我已经解决了这个问题,解决方案覆盖了serializer中的create函数:

使用django taggit序列化程序。及

尝试:

使用“
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引起的。加载(值)
不成功,我不知道例外的数据类型。

尝试:

使用“
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引起的。加载(值)
不成功,我不知道例外的数据类型。

更正上述答案,因为Ykh的解决方案不正确,当我想用json格式更新我的标记时(我得到了\r\m\symbols)


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


我仍然不理解使用的逻辑TaggitSerializer,所以我修改它以满足我自己的需求。它现在可以工作了,你能简单地解释一下为什么它以前不能工作吗?你能用它来更新(放置)数据吗?我在为您的患者使用thatThx时出错,我已将详细信息更新到问题中,一般来说,问题是当我尝试修改实例时,每次我放置数据时,括号(Json格式)将自动附加到实例上,如结果所示必须删除数据drf自动创建并使用旧格式进行更新,和newtag1一样,NewTag2我仍然不理解使用的逻辑TaggitSerializer,所以我修改它以满足我自己的需求。它现在可以工作了,你能简单地解释一下为什么它以前不能工作吗?你能用它来更新(放置)数据吗?我在为您的患者使用thatThx时出错,我已将详细信息更新到问题中,一般来说,问题是当我尝试修改实例时,每次我放置数据时,括号(Json格式)将自动附加到实例上,如结果所示必须删除数据drf自动创建并使用旧格式进行更新,像newtag1,newtag2一样,上面的答案有什么问题?需要改变什么?请在你的回答中包括这些细节。谢谢你上面的答案怎么了?需要改变什么?请在你的回答中包括这些细节。谢谢
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
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