2011-03-31 2 views
2

Давайте возьмем учебник 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, но я думаю, вы поняли идею.

ответ

1

Я думаю, что в django.db.models.query.get_where_clause

+0

... который называет (среди других, но это, кажется, один из интересных для меня) '' connection.ops.field_cast_sql' с django.db.models.fields. Field.db_type'. – Lloeki

Смежные вопросы