Использование 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"]'
}
Некоторые поля опущены для краткости. Обязательно включите необходимые поля, требуемые вашим сериализатором.