Как добавить поле в набор запросов и заполнить его в цикле?

У меня есть кверисет foo, который содержит несколько тысяч элементов. Теперь я хочу добавить к этому набору поле bar, значение которого зависит от некоторой логики, встроенной в цикл. Поэтому я хочу выполнить итерацию foo и обогатить bar для каждого элемента.

# Views.py

def example(request):

    [..]

    # Create `Bar` field for queryset
    foo.annotate(bar='')

    # Iterate queryset
    for item in foo:

        [..] # logic that returns a string
 
            # Populate field 'bar'
            item.bar = 'example_string'

Однако он уже обрывается на foo.annotate(bar=''), возвращаясь

QuerySet.annotate() получил невыражение(я): .

Если вы хотите аннотировать непустую строку, вы можете подать иск:

from django.db.models import Value

foo.annotate(bar=Value(''))

При этом аннотировать пустой строкой не имеет особого смысла, вы просто устанавливаете атрибут для ваших Foo объектов. Я бы также посоветовал обернуть элементы в список, так как в противном случае субскриптинг будет делать новые запросы к базе данных.

Вернуться на верх