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 从相关模型中减去两个字段的主要内容,如果未能解决你的问题,请参考以下文章