我有一个由用户上传的对象,它包含几个细节,但为了清楚起见,可以通过以下模型表示简单地定义 -
在此之后,其他用户可以对该用户上传的内容进行投票和否决,从而形成投票模型。
现在我想获得要在模板中显示的所有对象的赞成票和反对票。因此,我在类中添加了两个函数ObjectDetail
,分别是 upvote 和 downvote。
这个模型的问题是,假设有 20 个对象,每个对象触发 2 个查询,一个获得赞成票,另一个获得反对票。因此没有。20 个对象的查询现在是 40 个。
什么是调整它以减少查询数量并在每个对象上显示赞成票和反对票的好方法?
class ObjectDetail(models.Model):
title = models.CharField()
img = models.ImageField()
description = models.TextField()
uploaded_by = models.ForeignKey(User, related_name='voted_by')
@property
def upvote(self):
upvote = Vote.objects.filter(shared_object__id = self.id,
vote_type = True).count()
return upvote
@property
def downvote(self):
downvote = Vote.objects.filter(shared_object__id = self.id,
vote_type = False).count()
return downvote
class Vote(models.Model):
vote_type = models.BooleanField(default = False)
voted_by = models.ForeignKey(User, related_name='voted_by')
voted_for = models.ForeignKey(User, related_name='voted_for')
shared_object = models.ForeignKey(ObjectDetail, null=True, blank=True)
dtobject = models.DateTimeField(auto_now_add=True)