有效计数对象
Posted
技术标签:
【中文标题】有效计数对象【英文标题】:effective counting of objects 【发布时间】:2011-06-28 17:20:09 【问题描述】:我有 2 个模型:
Category(models.Model):
name = models.CharField(max_length=30)
no_of_posts = models.IntegerField(default=0) # a denormalised field to store post count
Post(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=100)
desc = models.TextField()
user = models.ForeignKey(User)
pub_date = models.DateTimeField(null=True, blank=True)
first_save = models.BooleanField()
因为我总是想表明不。帖子以及每个类别,每次用户以这种方式创建或删除帖子时,我总是计算并存储它们:
## inside Post model ##
def save(self):
if not pub_date and first_save:
pub_date = datetime.datetime.now()
# counting & saving category posts when a post is 1st published
category = self.category
super(Post, self).save()
category.no_of_posts = Post.objects.filter(category=category).count()
category.save()
def delete(self):
category = self.category
super(Post, self).delete()
category.no_of_posts = Post.objects.filter(category=category).count()
category.save()
........
我的问题是,除了计算每个对象,我们是否可以不使用类似的东西:
category.no_of_posts += 1 // in save() # and
category.no_of_posts -= 1 // in delete()
或者有没有更好的解决方案!
哦,我错过了!我更新了帖子模型以包含关系!
【问题讨论】:
每次我想列出编号时,我都使用no_of_posts
字段来摆脱查询数据库(计数对象)。类别的帖子。我认为通过找出适当的计数和存储实例将计数存储在数据库中会更好。这样我们就不需要在每次需要列表时计算对象。 数据库负载少了很多!!
【参考方案1】:
是的,一个更好的解决方案:
from django.db.models import Count
class CategoryManager(models.Manager):
def get_query_set(self, *args, **kwargs):
qs = super(CategoryManager, self).get_query_set(*args, **kwargs)
return qs.annotate(no_of_posts=Count('post'))
class Category(models.Model):
...
objects = CategoryManager()
由于您没有显示 Post 和 Category 之间的关系,我猜在 Count('posts')
部分。你可能不得不摆弄它。
哦,您会想从模型中删除 no_of_posts
字段。这没有必要。或者,您可以只更改注释的名称。
您仍然可以使用 category.no_of_posts
获取帖子计数,但您正在让数据库为您完成这项工作。
【讨论】:
以上是关于有效计数对象的主要内容,如果未能解决你的问题,请参考以下文章