Я пытаюсь добавить теги в свою модель с помощью сериализатора taggit и taggit. Я делаю свой API в остальном фреймворке. Я выполнил инструкцию ( https://github.com/glemmaPaul/django-taggit-serializer), но это все еще проблема:

"tags": ["Недопустимый список 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"
],

Но когда я собираюсь обновить это значение: он автоматически показал файл Json в остальной структуре:

enter image description here

И если вы поместите данные в свой api, результат будет:

enter image description here

Проблема в том, что каждый раз, когда я пытаюсь изменить экземпляр, который, включая «тег» в структуре отдыха, скобки и разрывы строк автоматически добавлялись в поле «тег», как показано на изображении


Обновление: похоже, я решил эту проблему, решение переопределяет функцию создания в сериализаторе:

используя 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
hsbzzhz 8 Окт 2018 в 07:11

2 ответа

Лучший ответ

Пытаться:

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) не удалось, и я не знаю, какой тип данных принят.

2
Ykh 8 Окт 2018 в 06:06

Исправление к ответу выше, потому что решение 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
0
Your lovely monka 30 Ноя 2019 в 12:29