如何向Django QuerySet添加其他列

dev*_*ev9 11 python sql django django-models

我有一个带书籍的QuerySet,我想score在每个Book结果中添加一个字段.

qs = Book.objects.all()
Run Code Online (Sandbox Code Playgroud)

在原始SQL中我会写:

SELECT
    *,
    (
        (SELECT COUNT(*) FROM votes WHERE value=1 AND book=b.id) - 
        (SELECT COUNT(*) FROM votes WHERE value=-1 AND book=b.id)
    ) AS score
FROM
    Book b;
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Django中实现它?我试过了annotate(),但它似乎不适合这种东西.

Jos*_*eph 31

原始SQL 不是唯一的方法.您可以使用Value()表达式(请参阅此处的文档):

from django.db.models import CharField, Value

MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))
Run Code Online (Sandbox Code Playgroud)

  • 您需要像平常一样导入[IntegerField](https://docs.djangoproject.com/en/1.10/ref/models/fields/#integerfield). (2认同)

amb*_*mbi 5

如果投票的可能值只有1和-1,则可以使用上述注释将它们求和:Book.objects.annotate(score=Sum('votes__value'))

如果还有更多可能的值,则可以通过添加.filter(votes__value__range=(1,1))到上述查询中来过滤注释。

如果是更复杂的,你将不得不使用extraselect