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()

Вернуться на верх