Django Querysets - добавить строковую литеральную аннотацию - PullRequest
1 голос
/ 09 января 2012

Я хочу буквально добавить строку в объект набора запросов. Почему, потому что я отправляю это в 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 ]

3 голосов
/ 03 июня 2016

Вы можете добавить буквальное значение с помощью Значение :

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()),
)
0 голосов
/ 09 января 2012

Вы можете использовать .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 () в выбор,но я не уверен.

...