Думаю по именам понятно кто-что делает.
set_many - принимает дикт
delete_many - хочет что-то итерирумое c ключами
clear - ничего не хочет, просто очищает кэш.
Что забавно в сообщении к коммиту написанно про get_many, но в диффе delete_many.
И что еще забавнее, говнокодеры опять используют dict.items для итерации, а не dict.iteritems (
DJANGO NEWS
Новости о DJANGO
воскресенье, 31 января 2010 г.
jQuery в админке
Сделали скрытие формы под новый элемент у инлайнов, и добавили jQuery.
Тем кто использовал сабж, провериться на конфликты!
Тем кто использовал сабж, провериться на конфликты!
Права анонимуса
Теперь анонимусы не бесправны!
После дискуссии в django-developers, расширили возможности авторизационных бэкендов.
Для новой фици, объявите supports_anonymous_user = True в своем бэкенде.
После этого в метод get_all_permissions начнут попадать анонимусы.
После дискуссии в django-developers, расширили возможности авторизационных бэкендов.
Для новой фици, объявите supports_anonymous_user = True в своем бэкенде.
После этого в метод get_all_permissions начнут попадать анонимусы.
Объектные вьюшки фидов
К релизу 1.2 в джанге поменяли систему вывода rss/atom лент.
Раньше схема была: описываешь класс, наследник от django.contrib.syndication.feeds.Feed и указываешь на него вьюшке django.contrib.syndication.views.feed.
Которая в свою очередь описывалась в урлах примерно так
Раньше схема была: описываешь класс, наследник от django.contrib.syndication.feeds.Feed и указываешь на него вьюшке django.contrib.syndication.views.feed.
Которая в свою очередь описывалась в урлах примерно так
пятница, 8 января 2010 г.
Удобные фиксчи
Думаю, этот пост наиболее интересен тем, кто пишет тесты, а тесты в свою очередь завязаны на фиксчи.
Думаю, знакомая штука )
Вроде бы все отлично, данные мы сохранили.
Но бывает их надо править руками, и тогда начинается настоящий гемор с поиском, т.к. "author": 42 - это совсем не говорящее указание.
Ведь, куда приятнее искать автора не по безликому pk, а по имени.
Кстати, так и сделали )
{
"pk": 1,
"model": "store.book",
"fields": {
"name": "Mostly Harmless",
"author": 42
}
}
Вроде бы все отлично, данные мы сохранили.
Но бывает их надо править руками, и тогда начинается настоящий гемор с поиском, т.к. "author": 42 - это совсем не говорящее указание.
Ведь, куда приятнее искать автора не по безликому pk, а по имени.
Кстати, так и сделали )
среда, 30 декабря 2009 г.
Read-only поля в админке
Релиз 1.2 меня прям радует своей человечностью )
Хотели read-only поля в админке? Получите, распишитесь.
К admin.ModelAdmin добавился новый атрибут: readonly_fields.
В использовании схож с list_display, т.е. можно указать не только поля модели, но и методы объекта админки.
И надо учесть что, если вы не задали порядок в fields или fieldsets, то read-only поля будут идти после обычных.
Хотели read-only поля в админке? Получите, распишитесь.
К admin.ModelAdmin добавился новый атрибут: readonly_fields.
В использовании схож с list_display, т.е. можно указать не только поля модели, но и методы объекта админки.
И надо учесть что, если вы не задали порядок в fields или fieldsets, то read-only поля будут идти после обычных.
четверг, 24 декабря 2009 г.
Человечный SQL
Джанга всегда славилась удобством из коробки, но как только тебе надо чуть больше, чем положено, начинается гемор...
Хороший пример это sql запрос, который стандартный ORM не позволял составить.
Правда, не буду лукавить, есть 2 метода запихивания своего sql в запрос:
Но вселенского счастья все равно не наступило )
И тут, ВНЕЗАПНО... ревизия 11921 и Model.objects.raw офигеть! )
Хороший пример это sql запрос, который стандартный ORM не позволял составить.
Правда, не буду лукавить, есть 2 метода запихивания своего sql в запрос:
- Обращение к базе минуя ORMБольшим минусом является, то что на выходе у нас список списков, а не объектов нужной нам модели.
connect.cursor().execute('SELECT * FROM `person`;')
- Дополнение запроса от ORMТут минус - в ограниченности.
Books.objects.filter(pages__gte=123).extra(select={'result': 'SUM(cost)'})
Но вселенского счастья все равно не наступило )
И тут, ВНЕЗАПНО... ревизия 11921 и Model.objects.raw офигеть! )
вторник, 15 декабря 2009 г.
Прощай ifequal
Думаю, всех задолбали кострированные темплейты в джанге, но в силу привычки/наличия существующего кода или еще чего люди с них не уходят и продолжают жрать кактус )
Самая простая ситуация:
Решается в джанге ну очень не явным способом )
Писался фильтр типа такого:
И использовался, как
Думаю, вы согласитесь это выглядит упячисто (
Конечно, можно было использовать уже готовые решения из снипитов. Но если это надо только на одной странице, то мне очень сильно лень искать и подключать сторонюю библиотеку. Вот если бы все уже было в транке...
Самая простая ситуация:
if len(words) > 10: print wordselse: print trim(words)
Писался фильтр типа такого:
def gt(value, count): return value > count
{% if word|length|gt:3 %}
Конечно, можно было использовать уже готовые решения из снипитов. Но если это надо только на одной странице, то мне очень сильно лень искать и подключать сторонюю библиотеку. Вот если бы все уже было в транке...
Новая система сообщений
Надавно закрылся еще один двух годичный тикет, "session-based messages". И уже давно пора, а то успел понаплодиться зоопарк решений:
http://code.google.com/p/django-notify/
http://djangoflash.destaquenet.com/
http://code.google.com/p/django-session-messages/
Дело в том, что изначально в джанге сообщения можно было создавать только для авторизованных пользователей, чего явно не достаточно. Самое просто решение было складывать мессаги в сессию:
А потом выдергивать в темплейте, думаю, так было сделано не мало велосипедов )
Итак, сейчас у нас есть django.contrib.messages и что приятно они не поломали обратную совместимость )
http://code.google.com/p/django-notify/
http://djangoflash.destaquenet.com/
http://code.google.com/p/django-session-messages/
Дело в том, что изначально в джанге сообщения можно было создавать только для авторизованных пользователей, чего явно не достаточно. Самое просто решение было складывать мессаги в сессию:
request.session['messages'] = ('Hi user', )
А потом выдергивать в темплейте, думаю, так было сделано не мало велосипедов )
Итак, сейчас у нас есть django.contrib.messages и что приятно они не поломали обратную совместимость )
Template cache
Есть у меня дурная привычка, просматривать svn log джанги по утрам, благодаря которой и появился этот блог, в общем, встречайте первый блин:
Сегодня я хочу поговорить о тормозах, и, как мне кажется, самое медленное место в джанге (помимо кривых рук программистов) это темплейты.
Сам принцип их работы очень напоминает cgi - на каждый запрос мы все делаем заново, заново ищем файл, заново читаем файл (или еще что) и наконец заново компилируем (получаем объект Template).
Конечно на этом работа с темплейтами не заканчивается, сам рендеринг еще не начинался, и основные тормоза как раз в нем, но повторюсь это выполняется на каждый запрос, и это правда не быстро.
Для решения этой проблемы 2 года назад открыли тикет 6262, предлагалось кэшировать темплейты после их первой загрузки, все бы хорошо, и сама задача выглядит не сложной, но есть забавные подводные камни.
Сегодня я хочу поговорить о тормозах, и, как мне кажется, самое медленное место в джанге (помимо кривых рук программистов) это темплейты.
Сам принцип их работы очень напоминает cgi - на каждый запрос мы все делаем заново, заново ищем файл, заново читаем файл (или еще что) и наконец заново компилируем (получаем объект Template).
Конечно на этом работа с темплейтами не заканчивается, сам рендеринг еще не начинался, и основные тормоза как раз в нем, но повторюсь это выполняется на каждый запрос, и это правда не быстро.
Для решения этой проблемы 2 года назад открыли тикет 6262, предлагалось кэшировать темплейты после их первой загрузки, все бы хорошо, и сама задача выглядит не сложной, но есть забавные подводные камни.
Подписаться на:
Сообщения (Atom)