Является ли хорошей идеей изменить поля в экземплярах модели, возвращаемых в QuerySet?Это убьет производительность? - PullRequest
0 голосов
/ 26 февраля 2012

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

Я хочу трактовать определенное поле - количество на складе - как целое число, чтобы в моем шаблоне я мог проверить его количество и отобразить соответствующее значение (в основном, если естьдоступно более 100 позиций, я хочу просто отобразить «100+ Доступно»).

Существующее значение для количества запаса хранится как, как ни странно, varchar, удерживающий поплавок (как будто возможно иметь дробные суммытовара на складе):

item.qty: u"72.0"

Теперь я считаю, что в худшем случае я могу использовать QuerySet.values ​​() и перебирать результаты, заменяя каждое количество запаса на проанализированную версию int ().о себе.Что-то вроде ...

item_list = items.values()
for item in item_list:
    item['qty'] = int(float(item['qty']))

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

Итак, я жалуюсь ни на что (Я имею в виду, что он определенно оценивает эти значения в шаблоне в любом случае), или есть лучший способ сделать то, что мне нужно сделать?

1 Ответ

0 голосов
/ 26 февраля 2012

Да, итерация в представлении будет оценивать весь набор запросов. Это может быть или не то, что вы хотите - например, если вы разбиваете на страницы, paginator автоматически ограничивает запрос, поэтому вы не хотите оценивать все это отдельно.

Я бы подошел к этому по-другому, вызвав функцию в шаблоне для форматирования данных. Вы можете сделать это с помощью метода в модели, если вы хотите отформатировать только одно поле:

class Item(models.Model):
    ...
    def get_formatted_qty(self):
        return int(float(self.qty))

и назовите это:

{{ item.get_formatted_qty }}

Или, чтобы сделать его более общим, вы можете определить пользовательский фильтр в тегах шаблона:

@register.filter
def format_value(value):
    return int(float(value))


{{ item.qty|format }}
...