В прошлом шаге мы разобрали с вами поля моделей и их параметры. Далее нам необходимо ознакомится с мета-классами модели. В Django Meta параметр модели — это класс, предоставляющий дополнительные параметры модели. Класс Meta позволяет вам установить дополнительные параметры модели, такие как имя таблицы, порядок и подробное имя. Добавление класса Meta к вашей модели совершенно необязательно.
Для того чтобы использовать мета-модель, вы должны добавить класс Meta в вашу модель, как показано ниже:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
options........
Опции мета-модели
Мета-модель имеет множество опций, которые вы можете предоставить вашей модели в ее внутреннем классе Meta:
1. abstract
Если abstract = True, то данная модель будет абстрактным базовым классом:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
abstract = True
2. app_label
Если модель определена за пределами приложений в INSTALLED_APPS, то ей необходимо объявить, к какому приложению она принадлежит:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
app_label = 'myapp'
3. verbose_name
verbose_name - это удобочитаемое имя для нашей модели.
verbose_name_plural - это удобочитаемое имя во множественном числе.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
verbose_name = 'Person'
verbose_name_plural = 'Persons'
4. ordering
ordering (упорядочивание) в основном используется для изменения порядка полей вашей модели.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
ordering = [-1]
Добавьте упорядочивание вот так [-1], и порядок изменится на убывающий.
Или мы можем использовать сортировку по внутреннему полю, например по полю даты.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
created = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ['-created']
5. proxy
Proxy-модели используются для изменения поведения модели, например, чтобы включить дополнительные методы или различные мета параметры. Обе модели работают в таблице базы данных исходной модели.
Чтобы создать proxy-модель, добавьте proxy=True в класс Meta вашей модели.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class PersonProxy(Person):
class Meta:
proxy = True
ordering = ['first_name']
Здесь мы определим модель PersonProxy, которая является proxy-моделью для модели Person. В этой модели(PersonProxy) изменена сортировка по умолчанию для QuerySets.
Обе модели, Person и PersonProxy работают в одной и той же таблице базы данных, а объекты доступны через модель ORM с помощью любой из моделей.
6. permissions
Дополнительные permissions (разрешения), которые нужно внести в таблицу разрешений при создании этого объекта. Разрешения на добавление, изменение, удаление и просмотр автоматически создаются для каждой модели.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
permissions = []
Вы можете добавить дополнительные разрешения внутри списка. Каждое разрешение представляет из себя кортеж, первый элемент которого код разрешения, а второй элемент - удобочитаемое имя этого разрешения.
7. db_table
Мы можем перезаписать имя таблицы, используя db_table в классе Meta.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
db_table = 'X'
Это изменит имя таблицы на X.
8. get_latest_by
Возвращает последний объект в таблице на основе заданного поля, обычно используемого для DateField, DateTimeField или IntegerField.
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=100)
pub_date = models.DateTimeField()
class Meta:
get_latest_by = 'pub_date'
Возвращает последний объект по порядку возрастания pub_date. Используется только с ORM методом latest() для получения последнего объекта и методом earliest() для получения первого объекта.
Например, мы можем взять модель из прошлого шага и добавить необходимые параметры в мета класс:
class Group(models.Model):
title = models.CharField(max_length=200, verbose_name='Название')
slug = models.SlugField(max_length=255, unique=True, verbose_name='URL имя')
description = models.TextField(verbose_name='Описание')
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
ordering = ['title']
Методы моделей
Чтобы добавить к своим объектам функциональность «на уровне строк», определите в модели пользовательские методы.
class Modelname(models.Model):
#Fields
field_name = models.CharField(max_length=, hepl_text=, choices=, Null etc)
#Metadata
class Meta:
ordering = ['field_name']
#Methods
def __str__(self):
return '<readable_name>'
В то время как методы Manager предназначены для работы на уровне таблицы, методы моделей действуют скорее на конкретный экземпляр модели.
Это важный метод для хранения бизнес-логики в одном месте - модели.
__str__()
"Магический метод" Python, который возвращает строковое представление любого объекта.
Это то, что Python и Django будут использовать всякий раз, когда экземпляр модели нужно принуждать и отображать в виде простой строки. В частности, это происходит, когда вы отображаете объект в интерактивной консоли или в административной панели. Мы его создали в прошлом разделе, и далее по курсу мы всегда будем работать с этим методом.
class Post(models.Model):
name = models.CharField(max_length=50)
text = models.TextField()
def __str__(self):
return self.name
Например, в коде выше мы возвращаем имя записей.
get_absolute_url()
Это говорит Django, как рассчитать URL-адрес объекта. Любой объект, который имеет URL-адрес, который однозначно идентифицирует его, должен определять этот метод. На примере блога мы рассмотрим его, позднее по курсу.
Другая группа шаблонных методов охватывает набор поведений, связанных с базой данных, и подлежит настройке. В частности, довольно часто возникает желание изменить работу save() и delete(). Вы можете переопределить эти методы (и любой другой метод шаблона), чтобы изменить их поведение.
Более подробнее мы рассмотрим эти методы при создании Блога 2.0, который будет написан на классах.