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

Posted

技术标签:

【中文标题】Django 从相关模型中减去两个字段【英文标题】:Django substract two fields from related model 【发布时间】:2014-09-17 20:38:40 【问题描述】:

有了这个模型:

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)

但由于第一个过滤器,第二个过滤器不起作用。

基本上我想要的是获得“正面投票”-“负面投票”的总和作为一个字段并按它排序。

谁能帮帮我?

提前谢谢你

【问题讨论】:

向我们展示您的模型。 排除 Count,该查询与执行 Vine.custom_object.filter(estado=2, voto__valoracion=False, voto_valoracion=True) 几乎相同,这并不像您想要的那样工作。您可能想阅读有关 chaining filters 的文档。 是的,如果我们看到模型会更容易。 嗨@danielcorreia,我刚刚用我的模型更新了这个问题。有帮助吗? 【参考方案1】:

AFAIK 你不能用 ORM 做那个查询。您也许可以使用a raw query 来做到这一点。

我认为如果你在你的 Vine 模型中添加一个计数字段并按它排序会更容易。然后在每次有新的投票时更新该计数字段。

类似这样的:

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的信息。

【讨论】:

嗨,@Jonathan 有什么想法吗?

以上是关于Django 从相关模型中减去两个字段的主要内容,如果未能解决你的问题,请参考以下文章

按外键/相关字段分组 django 查询集

来自 Django 中两个不直接相关的模型的内部连接

两个相关模型的 Django 查询

Django Rest Framework - 在序列化程序中获取相关模型字段

如何减去 django 模板中的两个字段?

Django使用“通过”关系表从模型中获取所有相关对象