使用 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
我正在尝试通过 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