Django:如何在models.py中而不是在views.py中总结downvote和upvote模型的元素?

时间:2015-01-09 20:34:43

标签: python django

我有一个NewLink模型,它有3个不同的IntegerField属性,一个用于downvotes,一个用于upvotes,最后一个用于两个up和down字段的总和。我知道每次需要'linklikessum'元素时我如何将视图文件中的两个字段相加,但我不知道如何轻松地将其编码到模型中。我显然更喜欢将总和刚刚硬编码为linklikesum元素的属性,所以我不必做Foo = NewLink.objects.get(pk=X)然后Foo.upvote + Foo.downvote之类的事情。有人可以帮助我,所以我不会这样做。每次都必须这样做吗?提前致谢

供参考,这是模型本身:

class NewLink(models.Model):
    upvote = models.IntegerField(default=0)
    downvote =  models.IntegerField(default=0)
    linklikessum = models.IntegerField(default=0)
    url = models.URLField(null=True)
          “””. . .more stuff…“”” 

        def __unicode__(self):
            return.self.url

2 个答案:

答案 0 :(得分:3)

除非这个总计是计算费用,否则我不会将其存储在数据库中,只需将其作为模型的属性即可。例如:

class NewLink(models.Model):
    upvote = models.IntegerField(default=0)
    downvote =  models.IntegerField(default=0)
    @property
    def votetotal(self):
        return self.upvote + self.downvote

但是如果 计算成本很高,你可以在模型的save()方法中做到这一点,例如:

class NewLink(models.Model):
    def save(self, *args, **kw):
        self.votetotal = self.upvote + self.downvote
        super(NewLink, self).save(*args, **kw)

答案 1 :(得分:1)

如果我正确理解了这个问题,你需要创建一个叫做方法的东西。方法是模型中的函数。而不是做三个IntegerFields,只使用两个并执行类似的操作。

class NewLink(models.Model):
    upvote = models.IntegerField(default=0)
    downvote =  models.IntegerField(default=0)
    url = models.URLField(null=True)
      “””. . .more stuff…“”” 

    def __unicode__(self):
        return self.url

    def link_likes_sum(self):
        return self.upvote + self.downvote