Автоматическое преобразование/кастинг в Django при выполнении поиска

Может ли кто-нибудь объяснить мне, где я могу найти информацию о том, почему это работает в Django? Я провел небольшое исследование в официальной документации и не смог ничего найти.

from django.db import models

class Document(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)

# Query using an integer
document1 = Document.objects.get(id=1)

# Query using a string that can be converted to an integer
document2 = Document.objects.get(id='1')

# Both queries should yield the same result

Я проверяю эти страницы в официальной документации:

This is because of the .get_prep_value(…) [Django- doc] and .get_db_prep_value(…) methods [Django-doc] of the IntegerField [GitHub]:

def get_prep_value(self, value):
    value = super().get_prep_value(value)
    if value is None:
        return None
    try:
        return int(value)
    except (TypeError, ValueError) as e:
        raise e.__class__(
            "Field '%s' expected a number but got %r." % (self.name, value),
        ) from e


def get_db_prep_value(self, value, connection, prepared=False):
    value = super().get_db_prep_value(value, connection, prepared)
    return connection.ops.adapt_integerfield_value(
        value, self.get_internal_type()
    )

Это определяет, какое значение передать базе данных, таким образом проверяется соединение, в котором заключена диалектная специфика базы данных, как разговаривать с базой данных.

Для получения дополнительной информации смотрите раздел преобразование значений запроса в значения базы данных [Django-doc].

Без лишней саморекламы я написал статью [django-antipatterns], в которой используется эта техника для создания поля, автоматически усекающего значения до часа, недели или месяца, чтобы сделать запрос более удобным.

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