Рубрики
Без рубрики

Структура – Django Orm Работает – Часть 1

Django Orm скрывает много сложности при разработке веб-приложения. Декларация модели данных … помечена Python, Django, база данных.

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
((), {})

В следующем посте я охвачу, как модели. * поле работает.

Резюме

  1. Модель Django наследует модель. Модель И все переменные классов инициализированные модель. * поле автоматически ведет себя как столбец в таблице.
  2. Взаимодействия к базе данных происходят через ModelManager через Объекты атрибут.

Примечания:

Оригинал: “https://dev.to/kracekumar/structure-django-orm-working-part-1-10ch”