Django:如何统计与数据库中其他对象相关的数量?

1 投票
1 回答
5722 浏览
提问于 2025-04-16 19:39

我想做一个应用,让大家可以组团一起买东西。我需要一个方法来查看已经有多少人参与购买了。我有以下的 models.py 文件:

from django.db import models

class Buyer(models.Model):
    ''' Buyer of the item '''

    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    # Pieces together full name from first and last
    def full_name(self): 
        return "%s %s" % self.first_name, self.last_name

    # String representation of buyer in the format 'firstname lastname (email)'
    def __unicode__(self):
        return "%s (%s)" % self.full_name, self.email

class Item(models.Model):
    '''The item being purchased'''

    name = models.CharField(max_length=50)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    # The number of items to be split
    quantity = models.IntegerField()
    pub_date = models.DateTimeField('Date Offered')
    # Expiration of the item on offer
    expires = models.DateField()

    # Relates item to buyers
    buyers = models.ManyToManyField(Buyer)

    # Calculates remaining slots
    def remaining(self):
        # How do I do this?

    # String representation of item using item name
    def __unicode__(self):
        return self.name

我知道从概念上讲,我只需要把提供的数量减去买的人数,但我不太清楚怎么实现这个。根据我读到的内容,似乎可以用类似这样的方式来做:

def remaining(self):
        return self.objects.aggregate(Count('buyers'))

不过我不是很有信心。有没有人能帮我找出最好的方法?

1 个回答

1

你可以直接获取结果,然后数一数:

def remaining(self):
  return self.quantity - len( self.buyers.all() )

其实,更新一下,文档上说不应该这样做,虽然这样做是可以的,所以:

def remaining(self):
  return self.quantity - self.buyers.all().count()

撰写回答