Как Django запрашивает «приведение» строк аргументов в соответствующие типы соответствия полей? - PullRequest
2 голосов
/ 31 марта 2011

Давайте возьмем учебник по 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 со значением string , равным '23', которое успешно обработано методом Manager (и, следовательно, QuerySet) get для получения результата запроса SQL, содержащего WHERE предложение с целым числом значением 23 определенно выглядит так:

SELECT * FROM polls_poll WHERE id=23

Конечно, Django выполнил преобразование из того факта, что поле id является AutoFieldодин.Вопрос как и когда .В частности, я хочу знать, какие внутренние методы вызываются и в каком порядке (вроде , что документ объясняет для проверки формы ).

Примечание: я взглянул на источники в django.db.models и нашел несколько *prep* методов, но не знаю ни когда и где они вызываются, не говоря уже о том, являются ли они тем, кем я являюсьищу.

PS: я знаю, что это не кастинг stricto sensu , но я думаю, вы поняли.

1 Ответ

1 голос
/ 31 марта 2011

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

...