Использование Django-taggit и django-taggit-serializer с проблемой - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь добавить теги в мою модель с помощью taggit и taggit serializer.Я сделал мой 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

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


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

с использованием 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

1 Ответ

0 голосов
/ 08 октября 2018

try:

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

...