Django从相关模型中减去两个字段

时间:2014-09-17 20:38:41

标签: django orm sum annotate

使用这个模型:

class Vine(models.Model):
   autor = models.ForeignKey(Viner,related_name='autor')
   titulo = models.CharField(max_length=450)
   estado = models.CharField(choices=ESTADOS_VINE, max_length=30)
   objects = models.Manager()
   custom_object = managers.VineManager()

和投票的模型

class Voto(models.Model):
   user = models.ForeignKey(MyUser)
   submit_date = models.DateTimeField(auto_now_add=True)
   vine = models.ForeignKey(Vine)
   valoracion = models.BooleanField(default=False)

和收藏夹的类(这个工作正常)

class Favorito(models.Model):
   date = models.DateTimeField(auto_now_add=True)
   user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='favoritos')

我有这个'查询'在Django。

vines = Vine.custom_object.filter(estado=2).\
            annotate(favoritosCount=Count('favoritos', distinct=True)).\
            filter(voto__valoracion=False).annotate(disLikesCount=Count('voto',      distinct=True))\
            .annotate(likesCount=Count('voto', distinct=True)).filter(voto__valoracion=True)

但第二个过滤器由于第一个过滤器无效。

基本上我想要的是得到正面投票的总和' - '反对票'作为一个领域和秩序。

有人可以帮助我吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

AFAIK您无法使用ORM进行查询。您可以使用a raw query进行此操作。

我认为如果您将计数字段添加到Vine模型并按顺序排序会更容易。然后每次有新的Voto时更新该计数字段。

这样的事情:

from django.db.models import F

class Vine(models.Model):
    ...
    votos = models.IntegerField()

    class Meta:
        ordering = ('votos',)


class Voto(models.Model):
    ...
    def save(self):
        """When saving new Voto instance, update related Vine."""
        if not self.pk:
             new_vote = 1 if self.valoracion else -1
             self.vine.update(votos=F('votos') + new_vote)
        return super(Voto, self).save()

PS:如果您想了解更多关于F expression的信息。