Фильтрация и группировка по отношениям "многие-ко-многим" 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)...']>