В этой статье MarsDevs поможет вам понять различные способы выполнения запросов в Django, поскольку вначале это может показаться довольно сложным.

Примечание. Прочтите, прежде чем копировать код.

Всякий раз, когда мы говорим модель, это означает стол. И объект здесь означает строку в этой таблице.

Что такое запрос Django?

Запрос Django — это выражение, которое мы можем использовать для записи/получения/обновления/удаления данных из базы данных.

Почему запрос Django?

Это не тот вопрос, который требует какого-либо ответа. Если вы здесь, значит, вы знаете, что когда пользователь взаимодействует с веб-приложением, ему требуются операции с базой данных. Таким образом, нам нужны запросы Django для взаимодействия с базой данных.

Реализация

Чтобы продемонстрировать, как использовать запросы Django, давайте сделаем некоторые предположения.

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

Пользователь класса (модели.Модель):

first_name = models.CharField (max_length = 255, пусто = False,)

last_name = models.CharField (max_length = 255, пусто = False,)

phone_number = models.CharField (max_length = 15, пусто = False,)

класс UserEducationDetails(models.Model):

пользователь = модели.ForeignKey(

Пользователь,

related_name="education_details",

on_delete=модели.КАСКАД,

)

школа = модели.CharField (max_length = 255, пусто = False,)

Major = models.CharField (max_length = 255, пусто = False,)

класс = модели.CharField (max_length = 15, пусто = False,)

ранг = models.CharField (max_length = 15, пусто = False,)

Пользователь хранит данные, связанные с пользователем, а UserEducationDetails хранит сведения об образовании пользователя.

Предположение. У нас уже есть некоторые данные в обеих моделях.

Все выполняемые операции будут в views.py, поэтому необходимо импортировать обе модели.

  1. Получить все данные из пользовательской модели

набор запросов = User.objects.all()

Это вернет список объектов (называемых набором запросов)

  1. Как получить доступ к данным из вышеуказанного набора запросов?

Все, что вам нужно сделать, это повторить.

для данных в наборе запросов:

печать (данные.first_name)

печать (данные.last_name)

  1. Получить все данные из модели UserEducationDetails

UserEducationDetails.objects.all()

  1. Теперь мы хотим узнать, чей id равен 1

набор запросов = User.objects.filter(id=1)

И вы получите набор запросов с объектом, идентификатор которого равен единице, если он присутствует. В противном случае набор запросов будет пуст, но ошибок не будет.

В качестве альтернативы можно использовать .get, но это приведет к ошибке, если объект отсутствует или найдено несколько объектов.

объект = User.objects.get (id = 1)

  1. Как получить доступ к данным из вышеуказанного объекта?

print(obj.first_name)

4. Несколько фильтров вместе

queryset = UserEducationDetails.objects.filter (id = 1, оценка = «A»)

Это означает, что идентификатор = 1 и оценка = «A»

Что, если мы хотим использовать или фильтровать вместо и?

из django.db.models импорт Q

queryset = UserEducationDetails.objects.filter(Q(id=1) | Q(оценка=”A”))

Можно комбинировать или с и

queryset = UserEducationDetails.objects.filter (Q (id = 1) | Q (оценка = «A»), rank = «first»)

Этот запрос преобразуется в ((id = 1 или класс = «A») и rank = «первый»)

Теперь давайте попробуем выполнить несколько сложных запросов.

  1. Допустим, вы выполняете фильтрацию на основе UserEducationDetails и хотите также получить данные пользовательской (родительской) модели.

queryset = UserEducationDetails.objects.filter(id=1).select_related("пользователь")

Все, что вам нужно сделать, это добавить select_related("user"), где user — это имя поля в модели UserEducationDetails.

Как насчет того, чтобы вы также хотели фильтровать на основе данных связанной модели?

набор запросов = UserEducationDetails.objects.filter(

id=1, user__first_name=”кира”,

).select_related("пользователь")

Здесь мы фильтруем, где UserEducationDetails id=1 и first_name пользователя «kira».

  1. Теперь, что если вы выполняете фильтрацию на основе модели User, а также хотите получить связанные данные модели UserEducationDetails. Это место, где становится интересно.

набор запросов = User.objects.filter(id=1).prefetch_related("детали_образования")

Это вернет данные из обеих моделей.

Если вы заметили, мы использовали prefetch_related("education_details"), где education_details используется в модели UserEducationDetails.

related_name="education_details", и именно так мы можем получить данные из обеих моделей, не запрашивая их обе по отдельности.

Теперь предположим, что вы хотите применить фильтр к модели 2-го уровня (например, UserEducationDetails).

из django.db.models импортировать Prefetch

queryset = User.objects.filter(first_name__startswith="ki").prefetch_related(

Предварительная выборка(

«детали_образования»,

queryset = UserEducationDetails.objects.filter (ранг = «первый»),

to_attr="user_education_details",

)

)

Вы можете предположить, что приведенный выше запрос похож на запрос внутри запроса (подзапрос).

Мы применяем фильтр к модели UserEducationDetails, где ранг равен «first», и к модели пользователя, где first_name начинается с «ki».

В Prefetch первый переданный параметр («education_details») — это related_name.

имя,

Второй параметр (queryset=UserEducationDetails.objects.filter(rank=”first”))

это подзапрос, который является фактическим набором запросов для префекта,

И третий параметр (to_attr="user_education_details") является необязательным,

если вы не прошли, вы можете получить доступ к данным из «education_details»

И поскольку мы передали его здесь, мы можем получить к нему доступ из user_education_details.

Например. печать (queryset.first (). user_education_details)