Не удалось передать объект модели django в сериализатор

#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. Нет, я ожидаю получить сериализованный объект автора, потому что поле автора статьи является полем внешнего ключа