Sobes.tech
Назад к вопросам
Junior — Middle
57

При создании или обработке URL в Django приходилось ли самостоятельно писать SQL-запросы для работы с базой данных?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Обычно в Django SQL вручную не пишут для обычной работы с URL или моделями, потому что ORM закрывает большинство задач. Но важно понимать, когда ORM недостаточно и нужен сырой SQL — для сложных запросов, оптимизации или интеграции с существующей схемой. Хороший ответ показывает, что кандидат умеет работать через Django ORM и при этом знает, как безопасно подключить raw SQL при необходимости.

Определение:

Django ORM позволяет получать и изменять данные без ручного написания SQL: запросы строятся на уровне Python-объектов. При обработке URL сама маршрутизация вообще не связана с SQL, но при переходе в view часто идет обращение к базе данных, и там обычно используют ORM. Ручной SQL применяют точечно, когда стандартных возможностей ORM не хватает или нужен полный контроль над запросом.

Пример использования:

Например, есть URL, который открывает карточку пользователя по id. В большинстве случаев во view достаточно ORM-запроса. Если же нужен нестандартный отчет или оптимизированный запрос с агрегацией, можно использовать raw SQL.

from django.http import JsonResponse
from django.db import connection
from myapp.models import User

def user_detail(request, user_id):
    user = User.objects.filter(id=user_id).first()
    return JsonResponse({
        "id": user.id if user else None,
        "name": user.name if user else None,
    })

def report(request):
    with connection.cursor() as cursor:
        cursor.execute(
            "SELECT status, COUNT(*) FROM myapp_order GROUP BY status"
        )
        rows = cursor.fetchall()

    return JsonResponse({"rows": rows})

Пояснение кода:

В первом примере обработчик URL вызывает ORM и получает пользователя по id без ручного SQL. Это типичный вариант для обычного CRUD.
Во втором примере используется connection.cursor(): курсор открывает доступ к SQL, затем выполняется запрос SELECT ... GROUP BY ..., а результаты читаются через fetchall(). Такой подход нужен, когда запрос проще или быстрее выразить напрямую SQL, чем средствами ORM.

Ключевые моменты:

  • Для обработки URL SQL обычно не нужен напрямую: URL-маршрутизация и база данных — разные уровни.
  • В Django для работы с БД в первую очередь используют ORM.
  • Ручной SQL уместен для сложных запросов, оптимизации и нестандартных сценариев.
  • Если пишется raw SQL, важно помнить о безопасности и защите от SQL-инъекций.
  • Хороший кандидат показывает знание и ORM, и базового доступа через cursor, а не только один из подходов.