Каково назначение прокси-моделей в Django?

Ответ

Прокси-модель в 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 предоставляет дополнительные возможности и поведение.