Для того, чтобы обращаться как к атрибуду, а не методу.
class A(object):
@property
def sum_p(self):
return 33
def sum(self):
return 33
inst = A()
print (inst.sum_p)
print (inst.sum())
В вашем случае получается след. образом:
class ClassRoom(models.Model):
classroom_number = IntegerField()
objects = models.Manager()
@property
def classroom_count(self):
return self.student_set.count()
далее. где-нибудь в коде вы пишите
cls_room = ClassRoom.objects.get(params)
print cls_room.classroom_count # а не cls_room.classroom_count()
Ну тут вы же понимаете, что будет постоянно дполнительный запрос происходить при обращении к instance.classroom_count.
Т.Е. возникает проблема N+1 запросов.. если вдруг вы делаете что-то типa такого:
for el in ClassRoom.objects.filter(params):
el.classroom_count
Поэтому, если идет обращение не к одному объекту, то стоит писать вот так:
for el in ClassRoom.objects.filter(params).annotate(classroom_count=Count('student')):
el.classroom_count
Updated 3 July 2014, 14:08 by arthg.