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__'