使用带有问题的Django taggit和Django taggit序列化程序
我试图通过taggit和taggit序列化程序在我的模型中添加标记。我在rest框架中制作API。 我遵循了说明(),但它仍然是一个问题: “标签”:[ “无效的json列表。以字符串形式提交的标记列表必须是有效的json。”] /setting.py使用带有问题的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
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