-
ORM (Object-Relational Mapping): Позволяет взаимодействовать с базой данных, используя объекты Python (модели), вместо написания SQL-запросов напрямую.
-
Модель: Класс Python, наследующийся от
django.db.models.Model
. Представляет таблицу в базе данных. -
Поле модели: Атрибут класса модели. Представляет столбец в таблице.
-
Экземпляр модели: Объект класса модели. Представляет строку в таблице.
# models.py from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50, verbose_name="Имя") last_name = models.CharField(max_length=50, verbose_name="Фамилия") age = models.IntegerField(null=True, blank=True, verbose_name="Возраст") def __str__(self): return f"{self.first_name} {self.last_name}"
-
Типы полей :
-
CharField
: Текстовое поле (обязателенmax_length
). -
TextField
: Большое текстовое поле. -
IntegerField
: Целое число. -
BooleanField
: Логическое значение (True
/False
). -
DateTimeField
: Дата и время. -
DateField
: Дата. -
TimeField
: Время. -
DecimalField
: Десятичное число с фиксированной точностью (обязательныmax_digits
,decimal_places
). -
EmailField
: Строка для email (с базовой валидацией). -
FileField
: Поле для загрузки файлов (требует настройкиMEDIA_ROOT
иMEDIA_URL
). -
ImageField
: Специализированное поле для изображений (наследуется отFileField
, требует Pillow). -
ForeignKey
: Связь “один ко многим” с другой моделью. -
ManyToManyField
: Связь “многие ко многим”. -
OneToOneField
: Связь “один к одному”. -
AutoField
: Автоинкрементное целочисленное поле (обычно первичный ключid
, добавляется автоматически). -
SlugField
: Поле для хранения “слага” (короткой метки для URL). -
URLField
: Поле для хранения URL (с валидацией). -
UUIDField
: Поле для хранения UUID.
-
-
Параметры, поддерживаемые полями всех типов:
-
verbose_name
- “человеческое” название поля, которое будет выводиться на веб-страницах. Если не указано, то будет выводиться имя поля; -
help_text
- дополнительный поясняющий текст, выводимый на экран. По умолчанию - пустая строка. Содержащиеся в этом тексте специальные символы HTML не преобразуются в литералы и выводятся как есть. Это позволяет отформатировать поясняющий текст НТМL-тегами; -
default
- значение по умолчанию, записываемое в поле, если в него явно не было занесено никакого значения. Может быть указано двумя способами:Как обычное значение любого неизменяемого типа:
is_active = models.BooleanField(default=True)
Если в качестве значения по умолчанию должно выступать значение изменяемого типа (список или словарь Python), то для его указания следует использовать второй способ.
Как ссылка на функцию, вызываемую при создании каждой новой записи и возвращающую в качестве результата заносимое в поле значение:
def is_active_default(): return not is_all_posts_passive ... ... is_active = models.BooleanField(default=is_active_default)
-
unique
- еслиTrue
, то в текущее поле может быть занесено только уникальное в пределах таблицы значение (уникальное поле). При попытке занести значение, уже имеющееся в том же поле другой записи, будет возбуждено исключение**IntegrityError
** из модуляdjango.db
. Если поле помечено как уникальное, по нему автоматически будет создан индекс. Поэтому явно задавать для него индекс не нужно. ЕслиFalse
, то текущее поле может хранить любые значения. Значение по умолчанию -False
; -
unique_for_date
- если в этом параметре указать представленное в виде строки имя поля даты (DateField
) или даты и времени (DateTimeField
), то текущее поле может хранить только значения, уникальные в пределах даты, которая хранится в указанном поле. Пример:title = models.CharField(max_length=50, unique_for_date='published') published = models.DateTimeField()
В этом случае Django позволит сохранить в поле
title
только значения, уникальные в пределах даты, хранящейся в полеpublished
; -
unique_for_month
- то же самое, что иunique_for_date
, но в расчет принимается не всё значение даты, а лишь месяц; -
unique_for_year
- то же самое, что иunique_for_date
, но в расчет принимается не всё значение даты, а лишь год; -
null
- еслиTrue
, то поле в таблице базы данных может хранить значениеnull
и, таким образом, являться необязательным к заполнению. ЕслиFalse
, то поле в таблице должно иметь какое-либо значение, хотя бы пустую строку. Значение по умолчанию -False
.
Отметим, что у строковых и текстовых полей, даже обязательных к заполнению (т.е. при их объявлении параметруnull
было присвоено значениеFalse
), вполне допустимое значение - пустая строка.
Если сделать поля необязательными к заполнению, задавTrue
для параметраnull
, то они вдобавок к этому могут хранить значениеnull
. Оба значения фактически представляют отсутствие каких-либо данных в поле, и эту ситуацию придется как-то обрабатывать.
Поэтому, чтобы упростить обработку отсутствия значения в таком поле, его не стоит делать необязательным к заполнению. Параметрnull
затрагивает только поле таблицы, но не поведение Django. Даже если какое-то поле присвоением параметру значенияTrue
было помечено как необязательное, фреймворк по умолчанию все равно не позволит занести в него пустое значение; -
blank
- еслиTrue
, то Django позволит занести в поле пустое значение, тем самым сделав поле необязательным к заполнению, еслиFalse
- не позволит. По умолчанию -False
. Параметрblank
задает поведение самого фреймворка при выводе на экран веб-форм и проверке введенных в них данных. Если этому параметру дано значениеTrue
, то Djangoпозволит занести в поле пустое значение (например, для строкового поля - пустую строку), даже если это поле было помечено как обязательное к заполнению (параметруnull
было дано значениеFalse
); -
db_index
- еслиTrue
, то по текущему полю в таблице будет создан индекс, еслиFalse
- не будет. По умолчанию -False
-
primary_key
- еслиTrue
, то текущее поле станет ключевым. Такое поле будет помечено как обязательное к заполнению и уникальное (параметруnull
неявно будет присвоено значениеFalse
, а параметруunique
-True
), и по нему будет создан ключевой индекс. В модели может присутствовать только одно ключевое поле! ЕслиFalse
, то поле не будет преобразовано в ключевое. Значение по умолчанию -Fаlsе
. Если ключевое поле в модели не было задано явно, сам фреймворк создаст в ней целочисленное автоинкрементное ключевое поле с именемid
; -
editаblе
- еслиTrue
, то поле будет выводиться на экран в составе формы, еслиFalse
- не будет (даже если явно создать его в форме) . По умолчанию -True
; -
db_column
- имя поля таблицы в виде строки. Если не указано, то поле таблицы получит такое же имя, что и поле модели.
auto_now=True/False
: (ДляDateField
/DateTimeField
) Автоматически обновлять поле текущей датой/временем при каждом сохранении объекта (.save()
).auto_now_add=True/False
: (ДляDateField
/DateTimeField
) Автоматически устанавливать поле в текущую дату/время при первом создании объекта.- Для связей (
ForeignKey
,OneToOneField
):on_delete
: Действие при удалении связанного объекта (models.CASCADE
,models.PROTECT
,models.SET_NULL
,models.SET_DEFAULT
,models.DO_NOTHING
,models.SET(...)
).related_name
: Имя для обратной связи от связанной модели.
-
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰