Ответ
Прокси-модель в Django — это способ изменить поведение существующей модели на уровне Python, не создавая для нее новую таблицу в базе данных. Она наследует от конкретной (неабстрактной) модели и действует как её "псевдоним" с расширенной или измененной функциональностью.
Ключевые особенности:
- Не создает новую таблицу в БД: Прокси-модель оперирует данными из таблицы родительской модели.
- Изменяет поведение: Позволяет переопределить стандартный менеджер (
objects
), добавить новые методы, изменить мета-опции (например,ordering
,verbose_name
). - Устанавливается через
Meta
: Для объявления модели как прокси используетсяproxy = True
во внутреннем классеMeta
.
Основные сценарии использования:
- Разные представления в админ-панели: Создать два разных интерфейса для управления одной и той же моделью (например,
PublishedArticle
иDraftArticle
). - Добавление кастомной логики: Расширить модель новыми методами, не затрагивая исходный класс.
Пример:
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 ссылаются на одни и те же записи в БД.