我正在尝试通过taggit和taggit序列化器在模型中添加标签。我在rest框架中制作API。 我遵循了说明(https://github.com/glemmaPaul/django-taggit-serializer),但这仍然是一个问题:
“标签”:[ “无效的json列表。以字符串形式提交的标签列表必须是有效的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,结果将是:
问题在于,每次我尝试修改包含rest框架中“ tag”的实例时,都会在“ tag”字段中自动添加括号和换行符,如图片结果所示
更新: 看来我已经解决了这个问题,解决方案是覆盖序列化程序中的create函数:
使用django-taggit-serializer。和
def create(self, validated_data):
tags = validated_data.pop('tags')
instance = super(JobSerializer, self).create(validated_data)
instance.tags.set(*tags)
return instance
答案 0 :(得分:1)
尝试:
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()
发布带有“ 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)
引起的错误不是成功的,我不知道哪种数据类型除外。
答案 1 :(得分:0)
更正上述答案,因为当我想以JSON格式(我有\ r \ m \符号)更新标签时,Ykh的解决方案工作不正确
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