В этой статье 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, поэтому необходимо импортировать обе модели.
- Получить все данные из пользовательской модели
набор запросов = User.objects.all()
Это вернет список объектов (называемых набором запросов)
- Как получить доступ к данным из вышеуказанного набора запросов?
Все, что вам нужно сделать, это повторить.
для данных в наборе запросов:
печать (данные.first_name)
печать (данные.last_name)
- Получить все данные из модели UserEducationDetails
UserEducationDetails.objects.all()
- Теперь мы хотим узнать, чей id равен 1
набор запросов = User.objects.filter(id=1)
И вы получите набор запросов с объектом, идентификатор которого равен единице, если он присутствует. В противном случае набор запросов будет пуст, но ошибок не будет.
В качестве альтернативы можно использовать .get, но это приведет к ошибке, если объект отсутствует или найдено несколько объектов.
объект = User.objects.get (id = 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 = «первый»)
Теперь давайте попробуем выполнить несколько сложных запросов.
- Допустим, вы выполняете фильтрацию на основе 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».
- Теперь, что если вы выполняете фильтрацию на основе модели 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)