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"
        )
Вернуться на верх