Как правильно сериализовать PrimaryKeyRelatedField в Django Rest Framework

У меня есть две модели Django:

  1. Book -- который имеет некоторые Wagtail StreamFields:
class Book(models.Model):
    title = models.CharField(max_length=255)
    cover_image = StreamField(...)
    ...
  1. Publisher - который является чистым Django:
class Publisher(models.Model):
    name = models.CharField(max_length=255)
    ...

Я хотел иметь PublisherChooser в админке Wagtail. Поэтому я [создал все, что требовалось, а затем] добавил поле в модель Book:

class Book(models.Model):
    title = models.CharField(max_length=255)
    cover_image = StreamField(...)
    ...
    publisher = models.CharField(max_length=10)

    panels = [
        FieldPanel("title"),
        FieldPanel("cover_image"),
        FieldPanel("publisher", widget=PublisherChooser),
    ]

Теперь у меня есть правильный PublisherChooser, когда я хочу создать книгу в Wagtail Admin.

Проблема

Теперь я хочу сериализовать модель Book. Поэтому я попытался:

class PublisherSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Publisher
        fields = [
            "name",
            ...
        ]
    name = serializers.CharField()
    ...

и

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = [
            "title",
            "cover_image",
            ...,
            "publisher",
    
    publisher = serializer.PrimaryKeyRelatedField(queryset=Publisher.objects.all())

    def update(self, instance, validated_data):
        publisher = validated_data.pop("publisher")
        instance.publisher_id = publisher.id
        return instance

    def to_representation(self, instance):
        data = super().to_representation(instance)
        publisher_serializer = PublisherSerializer(
            Publisher, context={"pk": instance.publisher}
        )
        data["publisher"] = publisher_serializer.data
        return data

Я получаю издателя в ответе, но данные издателя выглядят неправильно:

"publisher": {
            "name": "<django.db.models.query_utils.DeferredAttribute object at 0x7f9ffa146310>",
}

Добавьте many=True в поле PrimaryKeyRelatedField

publisher = serializer.PrimaryKeyRelatedField(queryset=Publisher.objects.all(), many=True)

Это, вероятно, решит вашу проблему

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