#django-models #serialization #django-rest-framework #django-serializer
Вопрос:
Я пытаюсь передать объект модели django в поле сериализатора, предназначенное для поля внешнего ключа в модели. Однако я получаю ошибку: «Объект типа AuthorUser не сериализуется в формате JSON».
Вот модель, для которой предназначен сериализатор:
class Article(models.Model):
title = models.CharField(max_length=200, unique=True)
author = models.ForeignKey(AuthorUser, on_delete=models.CASCADE)
body = models.TextField()
posted=models.BooleanField(default=False)
edited = models.BooleanField(default=False)
ready_for_edit = models.BooleanField(default=False)
Вот сериализатор (автор-это именно то поле, которое доставляет мне проблемы):
class CreateArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['title', 'body', 'author']
А вот представление, содержащее код, вызывающий ошибку (метод POST-это часть, вызывающая ошибку).:
@api_view(['GET', 'POST'])
def articles(request):
if request.method == 'GET':
articles = Article.objects.all()
serializer = CreateArticleSerializer(articles, many=True)
return Response(serializer.data)
if request.method == 'POST':
if request.user.is_authenticated:
author = AuthorUser.objects.get(id=request.data['author'])
request.data['author'] = author
print(request.data)
serializer = CreateArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return HttpResponse(status=401)
Любая помощь будет признательна! Просто чтобы вы знали, при создании этих статей с использованием идентификатора это работает, однако в статье создается новое поле с именем author_id. Затем, когда я пытаюсь получить доступ к автору, он выдает мне идентификатор автора, так что это не работает.
Ответ №1:
Вам необходимо изменить сериализатор следующим образом:
class CreateArticleSerializer(serializers.ModelSerializer):
author = serializers.SlugRelatedField(queryset=AuthorUser.objects.all(),
slug_field='id')
class Meta:
model = Article
fields = ['title', 'body', 'author']
Теперь, если вы передадите идентификатор в своем представлении при вызове сериализатора, он создаст объект модели. Надеюсь, это сработает для вас.
Комментарии:
1. Я попробую это сделать, когда вернусь домой из школы. Большое вам спасибо за помощь!
2. конечно, жду вашего ответа.
3. К сожалению, он все еще извлекает идентификатор автора при использовании сериализатора статей. Вот сериализатор создания при создании новой статьи: OrderedDict ([(«название», «asdfafsd»), («тело», «asfafssdf»), («автор», <Авторский пользователь: myemail@gmail.com>)]). Однако при извлечении той же статьи с помощью запроса GET и того же сериализатора он снова возвращает идентификатор. *при более тщательном тестировании я обнаружил, что сериализатор просто устанавливает author на все, что я передаю в поле author, строку, слиток или что-то еще
4. Итак, вы хотите получить имя автора вместо идентификатора при использовании запроса GET?
5. Нет, я ожидаю получить сериализованный объект автора, потому что поле автора статьи является полем внешнего ключа