Примените изменения к аннотации QuerySet - PullRequest
0 голосов
/ 14 мая 2019

Имея следующую модель, мне нужно, мне нужно применить некоторую функцию к каждой записи image_url (предварительно подписать ее маркером истечения срока действия).

class Item(models.Model):
    name = models.CharField()
    image_url = models.CharField()
    # other fields omitted

и набор запросов

qs = Item.objects.filter(q).annotate(name=F('name'), image_url=F('image_url)).values('name', 'image_url').annotate(count=Count('name'))

Я решил это с отображением функции в результирующий список, как здесь:

    def update_url(x):
        x['image_url'] = create_presigned_url(x['image_url'])
        return x
    sale_items = map(lambda x: update_url(x), list(qs)) 

Есть ли лучший способ, можно ли применить его к набору запросов до оценки list ()?

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете сделать преобразование более эффективным и компактным, написав его следующим образом:

qs = Item.objects.filter(q).values('name', 'image_url').annotate(count=Count('name'))
sale_items = <b>map(update_url</b>, qs<b>)</b>

Не нужно .annotate(..) полей, которые уже есть в наборе запросов, хотя это не так многоРазница в производительности запросак этой функции, но это не приведет к значительному улучшению.

Если вы не знаете реализацию функции create_presigned_url и каким-то образом можете превратить это в выражение, используя всевозможные функции, такие как Concat [Джанго-док] , Lower [Джанго-док] и т. Д.

Вы не можетевыполнить обработку на уровне базы данных.Вы не можете передать функцию «черного ящика» в запросе и как-то надеяться, что ваша база данных понимает Python или что существует некоторый слой, который преобразует функцию в выражение SQL.Кроме того, база данных сама по себе не имеет всех средств для оценки всех функций, например, если вашему create_presigned_url необходимо связаться с веб-сервером, это (вероятно) невозможно в вашей системе баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...