Модели в Django 3

Навигация по проекту
  1. Создание проекта в Django

  2. Создание моделей в Django для онлайн-магазина

  3. Административный сайт Django

  4. Создание представлений (views) в Django

 

Справочник моделей Django 

Модель - это класс, который содержит одну таблицу в вашей базе данных. Каждая модель представляет собой подклассы Python django.db.models.Model, а каждый атрибут модели,  представляет собой отдельную запись в базе данных. Чтобы модели были успешно обработаны Django, содержащие их приложения должный быть зарегистрированы в списке приложений проекта.

Приведем пример модели Django. В этом примере модели, описывается класс Student, у которого есть имя ( first_name ) и фамилия ( last_name ):

from django.db import models

class Student(models.Model):
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)

first_name и last_name являются полями модели. Каждое поле указывается как атрибут класса, и каждый атрибут сопоставляется со столбцом базы данных.

 Модель Student  создает вот такую ​​таблицу базе данных:

CREATE TABLE myapp_student (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(25) NOT NULL,
    "last_name" varchar(25) NOT NULL
);


 

Содержание страницы:

1.  Аргументы, доступные для всех типов полей Django

♦ null      ♦ blank      ♦ verbose_name      ♦ help_text      ♦ db_column     ♦ db_index 

db_tablespace      ♦ default      ♦ editable      ♦ primary_key      ♦ unique       

unique_for_date      ♦ unique_for_month      ♦ unique_for_year      ♦ error_messages

2. Типы полей моделей Django

TextField      ♦ CharField      ♦ EmailField      ♦ AutoField      ♦ BigAutoField     

BigIntegerField       ♦ BinaryField      ♦ BooleanField      ♦ DateField   

DateTimeField         ♦ DecimalField      ♦ DurationField      ♦ IntegerField

GenericIPAddressField      ♦ PositiveBigIntegerField      ♦ PositiveSmallIntegerField

SlugField      ♦ SmallAutoField      ♦ SmallIntegerField      ♦ TimeField

URLField      ♦ UUIDField

 

 

 

 

 

 

 

 

 

 

 

 

 

1.  Аргументы, доступные для всех типов полей Django

Если True, Django будет хранить пустые значения, как NULL в базе данных. По умолчанию False.

Избегайте использования null в строковых полях, таких как CharField и TextField. Если строковое поле имеет null=True, это означает, что у него есть два возможных значения для «нет данных»: NULL и пустая строка. В большинстве случаев иметь два возможных значения для «нет данных» излишне; соглашение Django заключается в использовании пустой строки, а не NULL. Единственное исключение - это когда CharField оба параметра unique=True и blank=True установлены. В этой ситуации null=True требуется избежать нарушения уникальных ограничений при сохранении нескольких объектов с пустыми значениями.

Как для строковых, так и для нестроковых полей вам также потребуется установить, blank=True, если вы хотите разрешить пустые значения в формах, поскольку null параметр влияет только на хранилище базы данных.

Если True, то Django позволит занести в поле пустое значение, в таком  случае поле станет не обязательным к заполнению. По умолчанию False.

Обратите внимание, что blank отличается от null. null связано исключительно с базой данных, тогда как blank связано с проверкой. Если в поле есть blank=True, проверка формы позволит ввести пустое значение. Если в поле есть blank=False, поле будет обязательным.

Удобочитаемое (" человеческое ") имя поля. Если имя не указано, то Django автоматически создаст его, используя имя атрибута поля, преобразовав подчеркивание в пробелы.

verbose_name="Пост"

Дополнительный поясняющий текст, отображаемый в виджете формы. Это полезно для документации, даже если ваше поле не используется в форме.

Обратите внимание, что это значение не экранируется HTML в автоматически сгенерированных формах и выводится как есть.  Например:

help_text="Введите дату Вашего рождения"

Имя столбца базы данных, используемого для этого поля. Если это не указано, Django будет использовать имя поля.

Если имя столбца вашей базы данных является зарезервированным словом SQL или содержит символы, недопустимые в именах переменных Python, в частности дефис - это нормально. Django цитирует имена столбцов и таблиц за кулисами.

Если True, для этого поля будет создан индекс базы данных.

Имя табличного пространства базы данных, которое будет использоваться для индекса этого поля, если это поле проиндексировано. По умолчанию используется параметр проекта DEFAULT_INDEX_TABLESPACE, если он установлен, или db_tablespace параметр модели, если он есть. Если серверная часть не поддерживает табличные пространства для индексов, этот параметр игнорируется.

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

Если False, поле не будет отображаться ни в админке, ни в каком-либо другом ModelForm. Они также пропускаются во время проверки модели . По умолчанию True.

Если True - это поле является первичным ключом модели.

Если вы не укажете primary_key=True в какое-либо поле  своей модели, то Django автоматически добавит его в поле для хранения первичного ключа, поэтому вам не нужно устанавливать primary_key=True в какие-либо поля, если вы не хотите переопределить поведение первичного ключа по умолчанию. Тип автоматически создаваемых полей первичного ключа можно указать для каждого приложения AppConfig.default_auto_field или глобально в DEFAULT_AUTO_FIELD в настройках.

primary_key=True подразумевает что null=False и unique=True. Для объекта разрешен только один первичный ключ.

Поле первичного ключа доступно только для чтения. Если вы измените значение первичного ключа на существующем объекте, а затем сохраните его, новый объект будет создан рядом со старым.

Если True, то в это поле должно быть занесено уникальное в пределах таблицы значение.

Это обеспечивается на уровне базы данных и проверкой модели. Если вы попытаетесь сохранить модель с повторяющимся значением в unique поле, то будет возбуждено исключение  django.db.IntegrityError.

Эта опция действительна для всех типов полей, кроме ManyToManyField и OneToOneField.

Обратите внимание: когда unique=True,  то указывать db_index не нужно, поскольку unique подразумевает создание индекса.

Задайте для него имя DateField или DateTimeField, чтобы это поле было уникальным для значения поля даты.

Например, если у вас есть поле title, в котором есть unique_for_date="pub_date", то Django не разрешит ввод двух записей с одинаковыми title и pub_date.

То же самое, что и unique_for_date, но в расчет принимается только месяц.

То же самое что  unique_for_date и unique_for_month, но в расчет принимается год.

error_messages, аргумент позволяет переопределить сообщения по умолчанию , что поле будет выводить. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые вы хотите переопределить.

Ключи сообщений об ошибках включают в себя null, blank, invalid, invalid_choice, unique, и unique_for_date. Дополнительные ключи сообщений об ошибках указаны для каждого поля в разделе Типы полей ниже.

 

2. Типы полей моделей Django

Каждое поле хранит значения определенного типа. Почти все поля поддерживают аргументы описанные раньше.

class TextField(**параметры)

Текстовое поле неограниченной длины. Рекомендуется применять для сохранения больших объемов текста. Поддерживает необязательный параметр max_length. Если он не указан, то можно записать значение любой длины.

context = models.TextField(max_length=5000)

class CharField ( max_length = None , ** параметры )

Строковое поле для строк от маленького до большого. Для больших объемов текста используйте TextField. CharField имеет один дополнительный обязательный аргумент max_length. 

max_length - указывает максимальную длину заносимого в поле значения.

title = models.CharField(max_length=30)

class EmailField(max_length=254, **параметры)

Адрес электронной почты в строковом виде. Поддерживает необязательный параметр max_length. По умолчанию стоит 254.

class AutoField ( ** параметры )

Значение IntegerField, которое автоматически увеличивается в соответствии с доступными идентификаторами. Обычно вам не нужно использовать это напрямую Поле первичного ключа будет автоматически добавлено в вашу модель, если вы не укажете иное.

class BigAutoField(**параметры)

64-битное целое число, тоже самое что и  AutoField, за исключением того, что оно гарантированно соответствует числам от 1до 9223372036854775807.

class BigIntegerField(**параметры)

64-битное целое число, тоже самое что и IntegerField, за исключением того, что оно гарантированно соответствует числам от -9223372036854775808 до 9223372036854775807.

class BinaryField(max_length=None, **параметры)

Поле для хранения необработанных двоичных данных. Он может быть назначен bytes, bytearray или memoryview. По умолчанию BinaryField устанавливает editable на False, в этом случае она не может быть включена в ModelForm. BinaryField имеет один дополнительный необязательный аргумент max_length.

class BooleanField(**параметры)

Поле хранящее значение True или False. Значение по умолчанию None, а не False. 

class DateField ( auto_now = False , auto_now_add = False , ** параметры )

Дата, представленная в Python datetime.date экземпляром. Имеет несколько дополнительных необязательных аргументов:

- DateField.auto_now
Автоматически при каждом сохранение записи будет устанавливаться текущее время. 

- DateField.auto_now_add
Автоматически устанавливает текущую дату только при создание записи. В последующем при изменение дата не меняется.

class DateTimeField ( auto_now = False , auto_now_add = False , ** параметры )

Дата и время, представленные в Python datetime.datetime экземпляром. Принимает те же дополнительные аргументы, что и DateField. Виджет формы по умолчанию для этого поля - одиночный DateTimeInput.

class DecimalField ( max_digits = None , decimal_places = None , ** параметры )
Десятичное число фиксированной точности, представленное в Python Decimal экземпляром. Он проверяет ввод с помощью DecimalValidator.

Имеет два обязательных аргумента:

- DecimalField.max_digits
Максимально допустимое количество цифр в номере. Обратите внимание, что это число должно быть больше или равно decimal_places.

- DecimalField.decimal_places
Количество десятичных знаков, которые нужно сохранить вместе с номером.

Например, для хранения чисел 999 с разрешением до 2 знаков после запятой вы должны использовать:

models.DecimalField(..., max_digits=5, decimal_places=2)

И для хранения чисел примерно до одного миллиарда с разрешением до 10 знаков после запятой:

models.DecimalField(..., max_digits=19, decimal_places=10)

class DurationField ( ** параметры )

Поле для хранения периодов времени - смоделировано на Python с помощью timedelta. При использовании в PostgreSQL используется тип данных, intervalа в Oracle тип данных . В противном случае используется микросекунды. INTERVAL DAY(9) TO SECOND(6)bigint

class IntegerField ( ** параметры ) 

Целое число ( 32 разрядное ) . Значения от -2147483648 до 2147483647 безопасны во всех базах данных, поддерживаемых Django. Он использует MinValueValidator и MaxValueValidator для проверки ввода на основе значений, поддерживаемых базой данных по умолчанию.

class GenericIPAddressField ( протокол = 'both' , unpack_ipv4 = False , ** параметры )

IP-адрес записанный по для протокола IPv4 или IPv6 в виде строки. Поддерживает два необязательных параметра:

- GenericIPAddressField.protocol
Ограничивает допустимые входные данные указанным протоколом. Допустимые значения: 'both'(по умолчанию) 'IPv4' или 'IPv6'. При сопоставлении регистр не учитывается.

- GenericIPAddressField.unpack_ipv4
Распаковывает сопоставленные адреса IPv4, например ::ffff:192.0.2.1. Если эта опция включена, этот адрес будет распакован 192.0.2.1. По умолчанию отключено. Может использоваться, только если для параметра protocol установлено значение 'both'.

class PositiveBigIntegerField ( ** параметры)

 Допускает значения только в определенной (зависящей от базы данных) точке. Значения от 0до 9223372036854775807 безопасны во всех базах данных, поддерживаемых Django.

class PositiveIntegerField ( ** параметры ) 
Должно быть либо положительным, либо нулевым ( 0). Значения от 0 до 2147483647 безопасны во всех базах данных, поддерживаемых Django. Значение 0 принято из соображений обратной совместимости.

class PositiveSmallIntegerField ( ** параметры ) 
Допускает значения только в определенной (зависящей от базы данных) точке. Значения от 0 до 32767 безопасны во всех базах данных, поддерживаемых Django.

class SlugField ( max_length = 50 , ** параметры ) 

Слаг - это короткая метка для чего-либо, содержащая только буквы, цифры, подчеркивания или дефисы. Обычно они используются в URL-адресах. Как и CharField, вы можете указать max_length. Если max_length не указано, Django будет использовать длину по умолчанию 50.

Часто бывает полезно автоматически предварительно заполнить SlugField на основе значения некоторого другого значения. Вы можете сделать это автоматически в админке с помощью prepopulated_fields.

prepopulated_fields = {'slug': ('title',)}

Если True, поле принимает буквы Юникода в дополнение к буквам ASCII. По умолчанию False.

class SmallAutoField(**параметры)

Допускает значения только в пределах определенного (зависящего от базы данных) предела. Значения от до 32767 безопасны во всех базах данных, поддерживаемых Django.

class SmallIntegerField ( ** параметры ) 
Допускает значения только в определенной (зависящей от базы данных) точке. Значения от -32768 до 32767 безопасны во всех базах данных, поддерживаемых Django.

class TimeField ( auto_now = False , auto_now_add = False , ** параметры ) 

Время, представленное в Python datetime.time экземпляром. Принимает те же параметры автозаполнения, что и DateField.

class URLField ( max_length = 200 , ** параметры ) 

Виджет формы по умолчанию для этого поля - файл URLInput.

Необязательный параметр max_length указывает максимальную длину заносимого в поле интернет-адреса. Значение по умолчанию 200.

class UUIDField ( ** параметры ) 
Поле для хранения универсальных уникальных идентификаторов. Использует UUIDкласс Python . При использовании в PostgreSQL хранится в uuidтипе данных, в противном случае - в файле char(32).

Универсальные уникальные идентификаторы - хорошая альтернатива AutoFieldfor primary_key. База данных не будет генерировать UUID для вас, поэтому рекомендуется использовать default:

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)