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 не работает с классами данных. Вы можете определить пользовательское поле модели. Но, вероятно, это потребует некоторой разработки.