Автоматическое преобразование/кастинг в 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
Я проверяю эти страницы в официальной документации:
- https://docs.djangoproject.com/en/5.0/ref/models/fields/#model-field-types
- https://docs.djangoproject.com/en/5.0/topics/db/queries/
- https://docs.djangoproject.com/en/5.0/ref/models/lookups/
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], в которой используется эта техника для создания поля, автоматически усекающего значения до часа, недели или месяца, чтобы сделать запрос более удобным.