Django DRF, как представить новые обогащенные поля в моих конечных точках?
Я хочу выполнить следующее упражнение, принимая во внимание мои 3 базовые модели, Room, Event, Book.
У меня есть две роли пользователей, "бизнес" и "клиенты"
Бизнес может создать помещение вместимостью M
- Бизнес может создавать события для каждого помещения.
- Бизнес может удалить комнату, если в этой комнате нет событий.
- Клиент может забронировать место для мероприятия.
- Клиент может отменить свое бронирование на мероприятие.
- Клиент может просмотреть все доступные публичные мероприятия.
Мои модели извлекают:
class Room(models.Model):
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
capacity = models.IntegerField(default=1)
def __str__(self):
return str(str(self.id) + ' capacity: ' + str(self.capacity))
class Event(models.Model):
date = models.DateField()
room = models.ForeignKey(Room, null=True, blank=True, on_delete=models.CASCADE)
owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
private = models.BooleanField(default=False)
def __str__(self):
return str(str(self.date) + ' - Room: ' + str(self.room.id))
class Book(models.Model):
user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
event = models.ForeignKey(Event, null=True, blank=True, on_delete=models.CASCADE)
def __str__(self):
return str(str(self.event.date) + '- Client: ' + self.user.username)
И мои сериализаторы:
from .models import Room, Event, Book
from rest_framework import serializers
class RoomListSerializer(serializers.ModelSerializer):
events = serializers.StringRelatedField(many=True)
class Meta:
model = Room
fields = '__all__'
class RoomSerializer(serializers.ModelSerializer):
events = serializers.StringRelatedField(many=True)
class Meta:
model = Room
fields = '__all__'
class BookListSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'user')
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'user')
class EventListSerializer(serializers.ModelSerializer):
books = BookListSerializer(many=True, read_only=True, source='book_set')
rooms = RoomListSerializer(many=False, read_only=True, source='room_set')
class Meta:
model = Event
fields = ('id', 'owner', 'room', 'date', 'rooms', 'private', 'books')
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = '__all__'
Я хотел бы, чтобы Event выводил поле capacity из Room. и мог отображать его в моем json-ответе.
У меня есть этот отрывок кода в моем представлении:
class EventViewSet(viewsets.GenericViewSet):
serializer_class = EventListSerializer
queryset = Event.objects.select_related('room', 'book')
pagination_class = StandardResultsSetPagination
def get_serializer_class(self):
if self.action == 'list':
return EventListSerializer
return EventSerializer
def get_queryset(self):
queryset = Event.objects.select_related('room')
if self.request.GET.get('date'):
queryset = queryset.filter(date=self.request.GET.get('date'))
else:
queryset = queryset.order_by('-id')
return queryset
def list(self, request):
queryset = self.filter_queryset(self.get_queryset()).exclude(private=True)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
как я должен подойти к этому, где должна быть моя логика, например, я хочу добавить в json из EventListSerializer поле space_avalible = room.capacity - Book.related_set.filter(Event.room=Room.Id).count()
.
как я могу этого добиться?
Вы можете добавить space_available
информацию в сериализатор с помощью SerializerMethodField
class EventSerializer(serializer.ModelSerializer):
space_available = serializers.SerializerMethodField()
def get_space_available(self, instance):
return instance.room.capacity - instance.room.book_set.count()