Фильтрация и группировка по отношениям "многие-ко-многим" Django

Как лучше написать приведенный ниже код с помощью метода .filter()?

Это мои модели

class RoomCategory(models.Model):
      price = models.CharField(max_length=1000, default='', blank=True, verbose_name=_("Price"))
      title = models.CharField(max_length=1000, default='', blank=True, verbose_name=_("Title"))
      description = RichTextField(default='', blank=True, verbose_name=_("Description"))

class Room(models.Model):
      category = models.ForeignKey(RoomCategory, verbose_name=_("Room category"), related_name="rooms", on_delete=models.CASCADE, null=True)

class Reservation(models.Model):
      forename = models.CharField(verbose_name=_('First name'), max_length=20, blank=True,)
      surname = models.CharField(verbose_name=_('Last name'), max_length=20, blank=True,)
      reservation_status = models.CharField(max_length=10,verbose_name=('Reservation status'),
      choices=(
        ('pending', _('Waiting')),
        ('accept', _('Accept')),
        ('reject', _('Reject')),
      ),default=('pending'),blank=True, null=True)
      rooms = models.ManyToManyField(Room)

Чтобы лучше выразить мои намерения. Мне нужно что-то, чего я мог бы достичь на чистом python с помощью чего-то вроде этого:

def check_availability(room, check_in, check_out):
    available_list = []
    reservation_list = room.reservation_set.all().filter(reservation_status="accept")
    for reservation in reservation_list:
        if reservation.date_from > check_out or reservation.date_until < check_in:
           available_list.append(True)
        else:
           available_list.append(False)
    return all(available_list)

Views.py

room_list = Room.objects.all()
available_rooms = {}
for room in room_list:
    if check_availability(room, data['date_from'], data['date_until']):
        if room.category.title in available_rooms:
            available_rooms[room.category.title] += 1
        else:
            available_rooms[room.category.title] = 1

Мне нужно получить вывод, подобный этому:

<QuerySet [{'RoomCategory': <RoomCategory>, 'count': 14}, 
       {'RoomCategory': <RoomCategory>, 'count': 25}, 
       {'RoomCategory': <RoomCategory>, 'count': 13},
       {'RoomCategory': <RoomCategory>, 'count': 2}, 
       {'RoomCategory': <RoomCategory>, 'count': 17},
       '...
       (remaining elements truncated)...']>
Вернуться на верх