Я использую Django 1.6 и имею следующие модели (немного упрощенные для удобства чтения):
class Person(models.Model):
name = models.CharField(max_length=128)
class Room(models.Model):
max_persons = models.SmallIntegerField()
name = models.CharField(max_length=30, unique=True)
class Stay(models.Model):
person = models.ForeignKey(Person)
STAY_TYPE = (
(1, 'Type 1'),
(2, 'Type 2'),
(3, 'Type 3'),
)
stay_type = models.CharField(max_length=1, choices=STAY_TYPE)
class Hospitalization(models.Model):
stay = models.ForeignKey(Stay)
date_in = models.DateField()
date_out = models.DateField(blank=True, null=True)
room = models.ForeignKey(Room)
С queryset
(в менеджере) я хотел бы получить все доступные комнаты на заданную дату, т.е. где max_persons
не встречается.
До сих пор я пытался поиграть с Q
и такими вещами, как Room.objects.filter(hospitalization__date_out__lt="2014-04-25")
, но я не могу понять сравнение max_persons
.
У вас есть идея?
ИЗМЕНИТЬ
Количество объектов Person, связанных с каждой комнатой, отражает количество людей в этой комнате.
Поэтому, согласно приведенным ниже предложениям Карла, я попытался поиграть с:
Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=hospitalization_set__stay__person.Count()).exclude(num_persons__lte=max_persons)
- Yields
NameError: name 'hospitalization_set__stay__person' is not defined
- Yields
Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=Count('hospitalization_set__stay__person')).exclude(num_persons__lte=max_persons)
- Yields
FieldError: Cannot resolve keyword 'hospitalization_set' into field.
- Yields
Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=Count('hospitalization__stay__person')).exclude(num_persons__lte=F('max_persons'))
- Yields nothing (
[]
), while I'm expecting at least three results according to my current DB. - При удалении
.exclude()
я все еще не получаю никаких результатов. Похоже, что.annotate()
, который я использую, делает что-то не так.
- Yields nothing (