Вопрос проверяет понимание механизма наследования моделей в Django ORM и его влияния на структуру базы данных.
Django ORM предоставляет три механизма наследования моделей, каждый из которых по-разному влияет на структуру базы данных и поведение объектов.
При использовании абстрактного базового класса Django не создает таблицу для родительской модели. Вместо этого поля родителя копируются в таблицы всех дочерних моделей. Это полезно для повторного использования полей и методов без дополнительных JOIN-запросов.
from django.db import models
class BaseProduct(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
abstract = True
class Book(BaseProduct):
author = models.CharField(max_length=100)
class Electronic(BaseProduct):
warranty = models.IntegerField()Каждая модель в иерархии получает свою таблицу в базе данных. Родительская и дочерняя таблицы связываются через автоматически созданное поле OneToOneField. Это позволяет выполнять запросы к родительской модели и получать все дочерние объекты, но требует JOIN-операций.
class Vehicle(models.Model):
brand = models.CharField(max_length=50)
year = models.IntegerField()
class Car(Vehicle):
doors = models.IntegerField()
# Создание объекта
car = Car.objects.create(brand='Toyota', year=2020, doors=4)
# Доступ к родительским полям
print(car.brand) # ToyotaПрокси-модели не создают новых таблиц. Они изменяют поведение Python (например, добавляют методы или меняют сортировку) для существующей модели. Все прокси-модели работают с одной и той же таблицей базы данных.
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class OrderedPerson(Person):
class Meta:
proxy = True
ordering = ['last_name']
def full_name(self):
return f'{self.first_name} {self.last_name}'Выбор типа наследования зависит от задачи: абстрактные классы подходят для повторения полей без лишних связей, мультитабличное наследование — для полиморфных запросов, а прокси-модели — для изменения поведения без изменения схемы.