【问题标题】:Using Django-taggit and django-taggit-serializer with issue使用 Django-taggit 和 django-taggit-serializer 有问题
【发布时间】:2019-03-12 17:07:08
【问题描述】:

我正在尝试通过 taggit 和 taggit 序列化程序在我的模型中添加标签。我在休息框架中制作我的 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

【问题讨论】:

    标签: django django-rest-framework django-taggit


    【解决方案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) 不成功引起的,我不知道哪种数据类型除外。

    【讨论】:

    • 我还是不明白TaggitSerializer使用的逻辑,所以我改一下以满足自己的需求。
    • 现在能用了,能不能简单解释一下为什么以前不能用?谢谢
    • 嗨,ykh,你可以用来更新(放置)数据吗?使用时出现错误
    • 谢谢你耐心,我已经在问题中更新了细节,一般来说,问题是当我尝试修改实例时,每次输入数据时,括号(Json格式)会自动附加在实例上,如结果所示
    • 只删除数据drf自动创建并使用旧格式更新,如newtag1,newtag2
    【解决方案2】:

    更正上面的答案,因为 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
    

    【讨论】:

    • 上面的答案有什么问题?需要改变什么?请在您的回答中包含这些详细信息。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多