Django模型出现次数统计

3

我对Django比较新,需要在我的模型方面得到帮助。

class Region(models.Model):
    region_name = models.CharField(max_length=10)
    def __str__(self):
        return self.region_name

class Property(models.Model):
    prop_name = models.CharField(max_length=200)
    region_name = models.ForeignKey(Region, on_delete=models.CASCADE, verbose_name="Region")
    prop_code = models.IntegerField(default=0, verbose_name="Property")
    def __str__(self):
        return self.prop_name

class Sale(models.Model):
    prop_name = models.ForeignKey(Property, on_delete=models.CASCADE)
    employee = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Person")
    prop_state = models.CharField(null=True, max_length=5, choices=[('new','New'),('used','Used')])
    date = models.DateField('Sale Date')
    def __str__(self):
        return '%s : %s %s - %s' % (self.prop_name.prop_name, self.employee, self.date, self.prop_state)

这里是我的模型。Property从Region继承,Sale从property继承。我想做的是计算一个区域内销售量和特定物业的销售量。但我不知道最好的方法是什么。我尝试使用lambda作为模型字段并使用count()函数,但我没有看到很大的成功。如果您有任何建议,请告诉我。
2个回答

2
如果您已经有了Property/Region对象,可以使用以下代码:
sales_per_property = Sale.objects.filter(prop_name=property).count()
sales_per_region = Sale.objects.filter(prop_name__region_name=region).count()

编辑:

看到您试图将lambda函数添加到模型字段中,这可能更符合您的需求。

class Region(models.Model):
    ...
    @property
    def sales(self):
        return Sale.objects.filter(prop_name__region_name=self).count()

同样地,对于属性也是如此。只需使用region.sales访问属性即可。


谢谢 @Iceandele,这正是我想要的结果。 - agua95

2
您可以为您的查询集添加 RegionProperty 的注释。例如:
from django.db.models import Count

regions = Region.objects.annotate(sales=<b>Count('property__sale')</b>)
properties = Property.objects.annotate(<b>sales=Count('sale')</b>)

这些查询集所产生的Regions/Propertys将会有一个额外的属性.sales,其中包含相关的Sale对象数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接