Django Orm скрывает много сложности при разработке веб-приложения. Декларация моделей данных и образец запроса упрощается, тогда как она структурирована по-разному за кулисами. Серия постов в блоге объяснит работу Django ORM (не просто преобразование кода Python в SQL), модельная декларация, запрос (Manager, Queryset), поддерживая несколько драйверов, написание пользовательских запросов, миграций и т. Д.
Рассмотрим определение модели из Учебник Django Отказ
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
В вопросе и выбора модель класса получает от модели. Модель
Отказ Наследование Модель
Сигналы Django во время выполнения класса – это модель базы данных. Вопрос:| Модель (позже преобразована в таблицу) содержит два дополнительных переменных класса,
Вопрос_text и
pub_date , что будет два столбца в таблице. Их тип обозначается путем создания экземпляра соответствующего типа полей, здесь
модели. Шарфилд, модели. Datetimefield Отказ Аналогичная работа применяется к модели выбора.
Запрос
Давайте покажем все экземпляры Вопрос:| (Все строки в таблице - Polls_Question).
>>> Question.objects.all()
Как и ожидалось, таблица пуста, а вызов метода возвращает пустой результат. Две вещи, чтобы заметить, являются Objects.all ()
и Queryset
Отказ Все данные ввода данных и из базы данных через Django ORM происходят через интерфейс объекта. Все результаты обернуты внутри запроса, даже пустые.
Откуда приходит экземпляр объектов?
>>> class Foo: ... pass ... >>> class Bar(Foo): ... pass ... >>> Bar.mro() [, , ]
Каждый класс Python имеет порядок разрешения метода, который определяет поведение вызова класса/метода Отказ В приведенном выше примере барный класс наследует класс FO. MRO
Метод возвращает заказ от ребенка на патентный класс, бар наследует Foo, Foo наследует объект. Как видите, у класса FOO нет унаследованного класса в коде, а MRO
Метод говорит, что Foo наследует объект. Все класс Python наследуется от объекта; следовательно, MRO
Метод возвращает объект
как последний родитель в списке.
>>> Question.mro() [, , ]
MRO для Вопрос:| Ясно и возвращает результат, как ожидалось.
>>> Bar>>> Question >>> Question.objects >>> Question.objects.mro() Traceback (most recent call last): File " ", line 1, in AttributeError: 'Manager' object has no attribute 'mro' >>> Question.objects.__class__.mro() [ , , , ]
Представительство Вопрос .Objects
отличается от представления Бар
и Вопрос:| классы. Как указано имя,
Объекты является примером
Менеджер Отказ
Объекты , экземпляр класса менеджера, наследует
Basemanagerfromqueryset и
BaseManager Отказ
>>> Choice>>> Choice.objects >>> Question.objects >>> Choice.objects is Question.objects False >>> Choice.objects == Question.objects True
Какие? Несмотря на то, что экземпляр использует другой идентификатор, но и тест на равенство Правда
Отказ
# It's decalared in manager class def __eq__(self, other): return ( isinstance(other, self.__class__) and self._constructor_args == other._constructor_args )
Логика для проверки равенства имеет две части – обе операнды должны быть одинакового типа, и их конструктор Args одинаковы. В этом случае (за кулисами) оба менеджера были вызваны пустыми аргументами.
>>> Question.objects._constructor_args ((), {}) >>> Choice.objects._constructor_args ((), {})
В следующем посте я охвачу, как модели. * поле
работает.
Резюме
- Модель Django наследует
модель. Модель
И все переменные классов инициализированныемодель. * поле
автоматически ведет себя как столбец в таблице. - Взаимодействия к базе данных происходят через
ModelManager
черезОбъекты
атрибут.
Примечания:
- Этот пост изначально появился в мой блог Отказ
- Обложка Фото Бессмысленно
Оригинал: “https://dev.to/kracekumar/structure-django-orm-working-part-1-10ch”