Django ForeignKey возвращает id вместо имени
Возврат по API:
{
"id": "2c1f7627-ae73-4ca3-8243-82bc61e84dc7",
"title": "fdgdfg",
"author": "a8e13c21-f1ad-4292-9f73-dcb2e8757350",
"price": "234234.00",
"published": "2021-08-26",
"edition": "dfgdfg",
"isbn_code": "dfgdfg",
"created_at": "2021-08-26T05:16:33.022617+02:00",
"updated_at": "2021-08-26T05:16:33.023618+02:00",
"pages": 342,
"description": "sdfsdfsdf",
"cover": "HARDCOVER",
"genre": "ACTION",
"language": "SERBIAN",
"format": "A3",
"publisher": "BIG_5"
}
Модели:
class Book(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=255, null=True, blank=True)
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True, blank=True)
price = models.DecimalField(decimal_places=2, max_digits=255)
published = models.DateField()
edition = models.CharField(max_length=255)
isbn_code = models.CharField(max_length=255)
pages = models.IntegerField(blank=True, null=True, default=0)
description = models.TextField(null=True, blank=True)
cover = models.CharField(max_length=30, choices=Cover.choices(), default=None, null=True, blank=True)
genre = models.CharField(max_length=30, choices=Genre.choices(), default=None, null=True, blank=True)
language = models.CharField(max_length=30, choices=Language.choices(), default=None, null=True, blank=True)
format = models.CharField(max_length=30, choices=Format.choices(), default=None, null=True, blank=True)
publisher = models.CharField(max_length=30, choices=Publisher.choices(), default=None, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Book'
verbose_name_plural = 'Books'
Серизализаторы:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'title', 'author',
'price', 'published', 'edition',
"isbn_code", 'created_at', "updated_at",
"pages", "description", "cover",
"genre", "language", "format",
"publisher"
)
Итак, я хочу получить имя автора вместо id в api. Задавайте любые вопросы, мне очень нужна помощь, так как я уже некоторое время бьюсь над этим вопросом.
Мне сказали добавить сюда больше деталей, но мне больше нечего сказать по этому поводу
Вы можете работать с SlugRelatedField
[DRF-doc] как author
, и таким образом реализовать это как:
class BookSerializer(serializers.ModelSerializer):
author = serializers.SlugRelatedField(
slug_field='full_name',
queryset=Author.objects.all()
)
class Meta:
model = Book
# …
Преимущество использования SlugRelatedField
в том, что его можно использовать как в направлении чтения, так и в направлении записи: если указать full_name
Author
, то можно использовать BookSerializer
для создания, обновления и получения деталей Book
.
можно сделать следующим образом:
class BookSerializer(serializers.ModelSerializer):
author = serializer.ReadOnlyField(source='author.full_name')
class Meta:
model = Book
fields = ('id', 'title', 'author',
'price', 'published', 'edition',
"isbn_code", 'created_at', "updated_at",
"pages", "description", "cover",
"genre", "language", "format",
"publisher"
)