Django: Являются ли модели Django классами данных?

Можно ли сказать, что модели Django считаются классами данных? Я не вижу аннотации @dataclass ни на них, ни на их базовом классе model.Models. Однако мы относимся к ним как к классам данных, потому что у них нет конструкторов, и мы можем создавать новые объекты, называя их аргументы, например, MyDjangoModel(arg1= ..., arg2=...). С другой стороны, модели Django также не имеют методов init (конструкторов) и не наследуются от класса NamedTuple.

Что происходит под капотом, когда я создаю новые объекты модели Django?

Большая часть магии, происходящей с моделями, если не почти вся, исходит от ее базового мета-класса.

Это можно найти в django.db.models.ModelBase, а именно в функции __new__.

Независимо от того, определен ли метод __init__ или нет (что на самом деле так и есть, согласно комментарию Абдула), это не означает, что его можно или нужно считать классом данных.

Как очень красноречиво описано в этом посте SO кем-то другим;

Что такое классы данных и чем они отличаются от обычных классов?

Несмотря на то, что модели django довольно явно и очевидно кажутся хранящимися в них некими данными, модели больше похожи на простой в использовании (и повторном использовании) набор функций, которые используют бэкэнд базы данных, где и хранится реальное состояние объекта, а модель просто предоставляет доступ к нему.

Также стоит отметить, что модели не хранят данные, а просто извлекают их.

Возьмем для примера такую простую модель:

class Person(models.Model):
    name = models.CharField()

Затем мы сделали что-то вроде этого в оболочке:

person = Person.objects.get(...)
print(person.name)

Когда мы обращаемся к атрибуту, django фактически запрашивает информацию у базы данных, и это генерирует запрос для получения значения.

Значение не АКТУАЛЬНО хранится на самом объекте модели.

С учетом этого, по своей сути, модели django НЕ ЯВЛЯЮТСЯ классами данных. Это обычные классы.

Django не работает с классами данных. Вы можете определить пользовательское поле модели. Но, вероятно, это потребует некоторой разработки.

Вернуться на верх