Эффективные исходные данные ModelChoiceField - PullRequest
0 голосов
/ 31 марта 2011

Чтобы установить начальные данные для моих ModelChoiceFields, в настоящее время я делаю следующее:

foo = ModelChoiceField(label="Foo label",
                       queryset=Foo.objects.all(),
                       initial=Foo.objects.get(pk=14))

Но я чувствую, что это может быть плохой практикой, и я не уверен в наиболее эффективном способе установки начальных данных.pk=14 - это запись по умолчанию "N / A".

В настоящее время, насколько я понимаю, оба Foo.objects.all() и Foo.objects.get(pk=14) делают отдельные запросы к БД, делает ли это длядорогая транзакция / избыточная?База данных для Foo довольно крошечная, но мне интересно, как оптимизировать определения ModelChoiceField.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Вы делаете два запроса, но они выполняются в разное время.

Querysets ленивы. Запрос в Foo.objects.all() не выполняется, пока форма не будет отображена. Это означает, что список доступных объектов Foo всегда будет актуальным.

Однако Foo.objects.get(pk=14) выполняется, когда форма определена , то есть при первом импорте модуля. Таким образом, это значение сохраняется в запросах до тех пор, пока процесс сервера остается активным. Это хорошо, потому что запрос выполняется не каждый раз, но потенциально плохо, что значение останется, даже если объект будет позже удален из базы данных.

Чтобы ответить на ваш конкретный вопрос, вы фактически делаете здесь только один запрос каждый раз.

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

Да, вы делаете два запроса, но ваш код очень понятен и легко читается. Если вы не профилировали код и не определили, что эта строка является проблемой, ваш код в порядке.

Если вы действительно хотите избежать двух запросов, я бы посоветовал посмотреть в кэш Django и кэшировать результаты наборов запросов, чтобы вы могли избежать их при последующих просмотрах страниц.

initial = cache.get("foo_modelchoice_initial")
if initial is None:
    initial = Foo.objects.get(pk=14)
    cache.set("foo_modelchoice_initial", initial)

foo = ModelChoiceField(label="Foo label",
                   queryset=Foo.objects.all(),
                   initial=initial)

Если Foo.objects.all() станет очень большим, тогда этот код станет медленным, но в этом случае вам придется заменить поиск AJAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...