I'd recommend modifying your design to include some status field on A.
The issue is one of "why?" Why does A have < 2 B's and why does A have >= 2 B's. Is it because user's didn't enter something? Or is because they tried and their input had errors. Or is it because the < 2 rule doesn't apply in this case.
Using presence or absence of a Foreign Key limits the meaning to -- well -- present or absent. You don't have any way to represent "why?"
Also, you have the following option
[ a for a in A.objects.all() if a.b_set.count() < 2 ]
This can be pricey because it does fetch all the A's rather than force the database to do the work.
Edit: From the comment "would require me to watch for user join / user leaving the pool events".
You don't "watch" anything -- you provide an API which does what you need. That's the central benefit of the Django model. Here's one way, with explict methods in the A
class.
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
You can also define a special Manager
for this, and replace the default b_set
Manager with your manager that counts references and updates A
.