使用Django-taggit和django-taggit-serializer出现问题 [英] Using Django-taggit and django-taggit-serializer with issue

查看:222
本文介绍了使用Django-taggit和django-taggit-serializer出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过taggit和taggit序列化器在模型中添加标签.我在rest框架中制作我的API. 我遵循了指示( https://github.com/glemmaPaul/django-taggit-serializer),但这仍然是一个问题:

I am trying to add tags in my model by taggit and taggit serializer. I making my API in rest framework. I followed the instruction(https://github.com/glemmaPaul/django-taggit-serializer) but it is still an issues:

标签":[ 无效的json列表.以字符串形式提交的标签列表必须是有效的json."

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

/setting.py

/setting.py

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

/models.py

/models.py

tags = TaggableManager(blank = True) 

/serializer.py

/serializer.py

class JobSerializer(TaggitSerializer,serializers.HyperlinkedModelSerializer):

# tag serializer
tags = TagListSerializerField()

view.py中没有任何变化.

There is noting changed in the view.py.

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

thanks @ykh for helping me to solve this problem, but it comes to new situation with error:

当您要初始化值时:

hao,free

结果将是这样:

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

但是,当我打算将更新添加到该值时: 它会自动在rest框架中显示Json文件:

But when I intend to put updates into this value: it showed the Json file in rest framework automatically:

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

and if you put data to your api, the result will be:

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

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

Update: It seems that I have solved this issue, the solution is overriding the create function in serializer:

使用django-taggit-serializer.和

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()

发布带有"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)引起的,未成功执行,我不知道哪种数据类型除外.

the error is caused by json.loads(value) is not success and i don't konw which data type is excepted.

这篇关于使用Django-taggit和django-taggit-serializer出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆