Django Querysets - 添加字符串文字注释

时间:2012-01-09 02:28:58

标签: django django-queryset django-orm

我想逐字地向查询集对象添加一个字符串。为什么,因为我将它发送给JSON,只需将信息放在那里并使其可用,而不必迭代查询集将其转换为自定义字典,这将是如此美好和干净。

我现在拥有的:

a_vote_set.aggregate(
                    count = Count('id'),
                    avg=Avg('score'),
                    std=StdDev('score'),
                    sum=Sum('score'),
                )

这让我知道了:

{"count": 1, "std": 0.0, "sum": -4.0, "avg": -4.0}

我想得到的是:

{"count": 1, "std": 0.0, "sum": -4.0, "avg": -4.0, "additional_value": "name of candidate"}

我希望通过这样的方式来获得:

    a_vote_set.aggregate(
                        count = Count('id'),
                        avg=Avg('score'),
                        std=StdDev('score'),
                        sum=Sum('score'),
                        additional_value=Literal(candidate.name),
                    )

or this:

    a_vote_set.aggregate(
                        count = Count('id'),
                        avg=Avg('score'),
                        std=StdDev('score'),
                        sum=Sum('score')
                 ).append(
                        additional_value=str(candidate.name),
                 )

关于这是否可行的任何想法?

2 个答案:

答案 0 :(得分:2)

您可以使用Value添加文字值:

a_vote_set.aggregate(
    count = Count('id'),
    avg=Avg('score'),
    std=StdDev('score'),
    sum=Sum('score')
).annotate(
    additional_value=Value(candidate.name, output_field=CharField()),
)

答案 1 :(得分:-1)

您可以使用.extra()之类的内容:

a_vote_set.aggregate(
                    count = Count('id'),
                    avg=Avg('score'),
                    std=StdDev('score'),
                    sum=Sum('score'),

                ).extra(
                       select={
                              'additional_value' : 'candidate_table.name' 
                              }, 
                       where=['candidate_table.id = vote_table.candidate_id']
                )

您也可以将Q()和F()值传递给select,但我不确定。