Что такое прокси-модель в Django и для чего она используется?

Ответ

Прокси-модель в Django — это способ изменить поведение существующей модели на уровне Python, не создавая для нее новую таблицу в базе данных. Она наследует от конкретной (неабстрактной) модели и действует как её "псевдоним" с расширенной или измененной функциональностью.

Ключевые особенности:

  • Не создает новую таблицу в БД: Прокси-модель оперирует данными из таблицы родительской модели.
  • Изменяет поведение: Позволяет переопределить стандартный менеджер (objects), добавить новые методы, изменить мета-опции (например, ordering, verbose_name).
  • Устанавливается через Meta: Для объявления модели как прокси используется proxy = True во внутреннем классе Meta.

Основные сценарии использования:

  1. Разные представления в админ-панели: Создать два разных интерфейса для управления одной и той же моделью (например, PublishedArticle и DraftArticle).
  2. Добавление кастомной логики: Расширить модель новыми методами, не затрагивая исходный класс.

Пример:

from django.db import models

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

# Прокси-модель для Person
class OrderedPerson(Person):
    class Meta:
        # Указываем, что это прокси-модель
        proxy = True
        # Изменяем сортировку по умолчанию
        ordering = ["last_name"]

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"

# OrderedPerson.objects.all() вернет всех Person, отсортированных по фамилии.
# Объекты Person и OrderedPerson ссылаются на одни и те же записи в БД.