Использование Django-Taggit в Django Rest Framework 3.13.1 с Django 4.0.2 с ошибкой "Invalid json list" в Serializing Tags Model Attribute

Старые решения используют django-taggit-serializer, который сейчас deprecated и не работает с версией, которая у меня есть.

Я уже сделал то, что сказано в документации относительно интеграции с DRF.

Однако, я получаю эту ошибку:

b'{"tags":["Неверный список json. Список тегов, представленный в строковой форме, должен быть корректным json."]}'

.

ошибка изображения в drf browsable api

Вот мой код

viewset.py

class AnnouncementViewSet(viewsets.ModelViewSet):
    """Announcement ViewSet."""

    queryset = Announcement.objects.all()
    serializer_class = AnnouncementSerializer
    lookup_field = "slug"
    permission_classes = [IsAdminUser, IsAuthorOrReadOnly]

    def get_permissions(self):
        """Return permissions."""
        if self.action in ["create", "update", "partial_update", "destroy"]:
            self.permission_classes = [IsAdminUser]
        else:
            self.permission_classes = [IsAuthorOrReadOnly]
        return super().get_permissions()

models.py

class Announcement(models.Model):
    """Announcement model."""

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    title = models.CharField(_("title"), max_length=255, unique=True)
    content = models.TextField(_("content"))
    is_featured = models.BooleanField(default=False)
    thumbnail = models.ImageField(
        upload_to="announcement/thumbnail", default="announcement/thumbnail/default.jpg"
    )
    tags = TaggableManager(_("tags"))
    slug = models.SlugField(_("Slug"), max_length=255, unique=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

serializers.py

class AnnouncementSerializer(TaggitSerializer, serializers.ModelSerializer):
    tags = TagListSerializerField()
        
    class Meta:
        model = Announcement
        exclude = ["slug"]

        extra_kwargs = {
            "url": {"view_name": "api:announcement-detail", "lookup_field": "slug"}
        }

Что я пробовал до сих пор:

tags = "my-tag"

tags = ["tag1", "tag2"]

Я даже написал тест:

tests.py

def test_announcement_create_url(
    self, api_client: Client, admin_user
):
    api_client.force_login(admin_user)
    response = api_client.post(
        reverse("api:announcement-list"),
        {
            "title": "This is a new announcement",
            "content": "This is the content of the new announcement",
            "is_featured": "True",
            "tags": ["tag1", "tag2"],
        },
    )
    print(response.content)
    assert response.status_code == status.HTTP_201_CREATED

Но он выдает ту же ошибку.

Я также нашел этот выпуск на GitHub, но опять же, django-taggit-serializer устарел и больше не поддерживается.

Нашел свой собственный ответ. Причиной ошибки является мой tags Атрибут модели.

Если атрибут вашей модели имеет имя tags, то для отправки или проверки вашего API запроса вам нужно сделать следующее:

Просматриваемый API

{
    "tags": ["tag1", "tag2"]
}

Код Python

{
    "tags": '["tag1", "tag2"]'
}

Некоторые поля опущены для краткости. Обязательно включите необходимые поля, требуемые вашим сериализатором.

Вернуться на верх