Django 5 для начинающих

Прогресс по курсу:  9/1004

3.2 Модели в Django и их поля
3 из 11 шагов пройдено
0 из 42 баллов  получено

В прошлом шаге мы разобрали с вами поля моделей и их параметры. Далее нам необходимо ознакомится с мета-классами модели. В 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, который будет написан на классах.


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Душню, но тут кажется лишние отступы)

@Нарбеков_Марсель, спасибо, исправил.

Вроде не хватает indexes как опции мета моделей, или их гораздо больше и стоит обратиться к документации?

@Ilia_Boiarintsev, На примере блога мы сделаем самую простую индексацию. Но на самом деле, индексация довольно сложная тема, и нужно понимать где и какую использовать. У нас во втором курсе ей посвящено 3 раздела.

В то время как методы Manager предназначены для работы на уровне таблицы


Подскажите, это к чему относится?

@Sergey_Udachin, это относится к менеджерам модели, они будут рассматриваться далее в курсе.

Изменен Дмитрий Селезнев

Поясните, пожалуйста, в разделе 5: "Здесь мы определим модель Person, которая является proxy-моделью для модели Teacher." В коде: class Meta: proxy = True. Прокси относится к классу Teacher или Person? 

@Максим_Ананьев, я отредактировал лекцию и изменил имя прокси-модели, теперь стало намного понятнее.

@Дмитрий_Селезнев, да, теперь все ясно, благодарю

Тема proxy не раскрыта, если мягко... Если "это сложно", то зачем ее здесь упоминать?

Кто же здесь подкласс?

Видимо, все-таки 

from django.db import models


class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class Teacher(models.Model):
    pass

    class Meta:
	    proxy = True

- судя по примеру, приведенному здесь

@ilya_kutaev, Переделали описание прокси моделей, там действительно были недоработки.

@Илья_Перминов, Спасибо, вижу!

Только кмк Person д.б. базовым классом, а не наоборот. Не всякий Person является Teacher

@ilya_kutaev, Согласен! Исправил.

откуда здесь "category"? у нас же нет такого поля в модели

@Anna_Shevchenko, Спасибо, исправил.

Я правильно понимаю, что заданного поля в get_latest_by нет в описании модели?

@Максим_Михеев, Спасибо, переделал и добавил еще уточнение.