Дублирование запроса в Django приводит к медленной загрузке

У меня проблемы с поиском решения для дублированных запросов, я пробовал делать это.

Код:

for c in coupons:
    fname = Users.objects.filter(
        id=c['WhoReviewed']).values('first_name')
    lname = Users.objects.filter(
        id=c['WhoReviewed']).values('last_name')

    for f in fname:
        first = f['first_name']
    for l in lname:
        last = l['last_name']

        full = first + ' ' + last
        c['WhoReviewed'] = full

Результат:

result

Вы делаете два запроса на один купон. Вы можете получить всех пользователей с помощью одного запроса, а затем определить полные имена с помощью:

users = Users.objects.filter(
    id__in=[c['WhoReviewed'] for c in coupons]
)
temp = {}
for user in users:
    temp[user.id] = f'{user.first_name} {user.last_name}'

for c in coupons:
    data = temp.get(int(c['WhoReviewed']))
    if data is not None:
        c['WhoReviewed'] = data

Однако моделирование выглядит немного "странно". Обычно следует ожидать, что модель coupon (?) имеет ссылку ForeignKey на модель User, указывающую на человека, просмотревшего купон. Затем вы можете использовать .select_related(…) [Django-doc], чтобы использовать запрос к купонам для немедленной загрузки связанных пользователей.

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