Давайте возьмем учебник Django. В первой части мы можем найти эту модель:Как строки аргументов Django «бросают» в соответствующие типы сопоставления полей?
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
, с которой Django генерирует следующий SQL:
CREATE TABLE "polls_poll" (
"id" serial NOT NULL PRIMARY KEY,
"question" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
Можно отметить, что Django автоматически добавлен AutoField
, славно именем id
, которая сродни IntegerField
тем, что он обрабатывает целые числа.
В части 3, мы строим настраиваемое представление, достижимое по следующему шаблону URL:
(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
Учебник услужливо объясняет, что последующий запрос HTTP приведет к следующему вызову:
detail(request=<HttpRequest object>, poll_id='23')
несколько свитков позже, мы можем найти этот фрагмент:
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
Обратите внимание, как URL-хвост компонент становится poll_id спор с строки значением из '23'
, благополучно месили методом Manager
(и, следовательно, QuerySet
) get
для получения результата в SQL запроса, содержащего статью WHERE
с целочисленного значением 23
, конечно, глядя как этот один:
SELECT * FROM polls_poll WHERE id=23
Конечно Джанго выполняется преобразование из того факта, что id
поле является AutoField
один. Вопрос как, и когда. В частности, я хочу знать, какие внутренние методы называются и в каком порядке (вроде what the doc explains for form validation).
Примечание: я взглянул на источники в django.db.models
и нашел несколько методов *prep*
, но не знаю ни того, ни когда они называются, не говоря уже о том, что они того, что я ищу.
PS: Я знаю, что это не литье stricto sensu, но я думаю, вы поняли идею.
... который называет (среди других, но это, кажется, один из интересных для меня) '' connection.ops.field_cast_sql' с django.db.models.fields. Field.db_type'. – Lloeki