Ответ
Прокси-модель в Django — это подкласс существующей модели, который не создает новую таблицу в базе данных. Она позволяет изменять Python-уровневое поведение модели (например, добавлять новые методы, изменять стандартный менеджер или порядок сортировки), работая с той же таблицей, что и родительская модель.
Основная цель — предоставить разные интерфейсы для одной и той же структуры данных.
Ключевые случаи использования:
- Добавление методов: Расширение API модели без изменения её полей.
- Изменение менеджера по умолчанию: Например, для автоматической фильтрации queryset (
ActiveUser.objects.all()будет возвращать только активных пользователей). - Изменение мета-опций: Установка другого
ordering,verbose_nameи т.д.
Пример:
Предположим, у нас есть модель Person. Мы хотим создать отдельную модель OrderedPerson для работы с отсортированными по имени записями, не создавая лишнюю таблицу.
from django.db import models
# 1. Родительская модель
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def __str__(self):
return f"{self.first_name} {self.last_name}"
# 2. Прокси-модель
class OrderedPerson(Person):
class Meta:
# Указываем, что это прокси-модель
proxy = True
# Задаем сортировку по умолчанию
ordering = ["last_name", "first_name"]
def get_full_name(self):
# Добавляем новый метод
return f"{self.last_name}, {self.first_name}"
# Использование:
# person = Person.objects.create(first_name="John", last_name="Doe")
# ordered_person = OrderedPerson.objects.get(id=person.id)
# ordered_person.get_full_name() -> "Doe, John"
# OrderedPerson.objects.all() -> вернет queryset, отсортированный по last_name
Таким образом, OrderedPerson и Person работают с одной и той же таблицей app_person, но OrderedPerson предоставляет дополнительные возможности и поведение.