Я бы порекомендовал изменить ваш дизайн, добавив в него поле статуса A.
Вопрос один из "почему?" Почему A имеет <2 B, и почему A имеет> = 2 B. Это потому, что пользователь ничего не вводил? Или потому, что они пытались, и на их входе были ошибки. Или потому, что в этом случае правило <2 не применяется. </p>
Использование наличия или отсутствия внешнего ключа ограничивает значение - хорошо - присутствует или отсутствует. У вас нет никакого способа представить «почему?»
Кроме того, у вас есть следующая опция
[ a for a in A.objects.all() if a.b_set.count() < 2 ]
Это может быть дорого, потому что он выбирает все А, а не заставляет базу данных выполнять работу.
Редактировать: Из комментария "потребовалось бы, чтобы я наблюдал за присоединением пользователя / пользователем, покидающим события пула".
Вы ничего не «смотрите» - вы предоставляете API, который делает то, что вам нужно. Это главное преимущество модели Django. Вот один из способов с использованием методов explict в классе A
.
class A( models.Model ):
....
def addB( self, b ):
self.b_set.add( b )
self.changeFlags()
def removeB( self, b ):
self.b_set.remove( b )
self.changeFlags()
def changeFlags( self ):
if self.b_set.count() < 2: self.show= NotYet
else: self.show= ShowNow
Вы также можете определить специальный Manager
для этого и заменить менеджер по умолчанию b_set
вашим менеджером, который считает ссылки и обновления A
.