Как правильно сериализовать PrimaryKeyRelatedField в Django Rest Framework
У меня есть две модели Django:
- Book -- который имеет некоторые Wagtail StreamFields:
class Book(models.Model):
title = models.CharField(max_length=255)
cover_image = StreamField(...)
...
- 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)
Это, вероятно, решит вашу проблему