Django REST Framework, Сериализаторы: Дополнительные данные?

Добрый день,

Я хотел бы спросить, есть ли возможность получить дополнительные данные внутри моих сериализаторов? Вот мои модели...

models.py

class Chair(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False, unique=True)
    bookable = models.BooleanField(default=False)
    user_created = models.CharField(max_length=100)
    date_created = models.DateField(auto_now_add=True)

class Booking(models.Model):
    chair = models.ForeignKey(Chair, on_delete=models.CASCADE)
    day = models.DateField()
    user_name = models.CharField(max_length=100)
    user_created = models.CharField(max_length=100)
    date_created = models.DateField(auto_now_add=True)

и эти мои сериализаторы...

serializers.py

class BookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = '__all__'


class ChairSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chair
        fields = '__all__'

При выполнении запроса внутри js, как это...

views.py

@api_view(['GET'])
def bookings_by_date(request, pk):
    bookings = Booking.objects.filter(day=pk)
    serializer = BookingSerializer(bookings, many=True)
    return Response(serializer.data)

script.js

let url = '...here's my url for Booking...';

fetch(url)
.then((resp) => resp.json())
.then(function(data) {
    // do something here
});

...Я хотел бы получить не только id кресла (models.Foreignkey), но и его название. Моя первая мысль была сделать что-то вроде этого...

class ChairSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chair
        fields = [
            ...
            'chair',
            'chair__name',
            ...
            ]

... но это, похоже, не работает! Кто-нибудь знает решение моей проблемы? Спасибо за помощь и хороших выходных!

Вы можете использовать один из этих двух способов:

1-) Использование SerializerMethodField. Этим способом можно добавлять поля, доступные только для чтения. Вы должны добавить метод get_<field_name> или указать имя метода, который вы хотите запустить для этого поля с помощью ключевого слова name. Более подробную информацию вы можете найти в документе

class BookingSerializer(serializers.ModelSerializer):
    chair__name = serializers.SerializerMethodField()

    class Meta:
        model = Booking
        fields = '__all__'

    def get_chair_name(self, obj):
        return obj.chair.name

2-) Использование поля CharField с атрибутом source: Вы можете определить, откуда в основном заполняется это поле.

 class BookingSerializer(serializers.ModelSerializer):
    chair__name = serializers.CharField(source='chair__name')

    class Meta:
        model = Booking
        fields = '__all__'
Вернуться на верх