Меня зовут — Анатолий Ларин

Блог о разработке и разработчике

Андрей Аксенов: “Как готовить Sphinx” / мастер-класс

Интро

В субботу, 18-го июня в Киеве пройдет мастер-класс создателя  движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”.

Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких загрузках.

Sphinx используют такие монстры, как CraigsList, DailyMotion, Meetup, HupPages, HabraHabr и еще десятки высоконагруженных сайтов. Андрей Аксенов  выступал на многочисленных конференциях в России: “DevPoint 1-2″, “РИТ”, “DevConf 2011″, “HighLoad ++”. Организатор конференции пользователей Sphinx в Москве. Автор нашумевшего доклада “Как прекратить писать”.

Дополнительная информация и подробный план мастер-класса можна посмотреть на сайте http://www.smartme.com.ua/sphinx-workshop/

Django 1.x & form_for_model

Интро

Давным-давно, когда деревья были большими, “джанга”  маленькой, а формы “новыми”, существовала такая функция: form_for_model. И на основе этой функции был даже создан сниппет, позволяющий динамический создавать форму по модели и менять “на лету” свойства созданной формы.

Однако, начиная с версии Django 1.0 данная функциональность была помечена как “deprecated” и уже в 1.0 beta 1 удалена.
Read the rest of this entry »

Человечность

Интро

Человечность
Read the rest of this entry »

Роботы

Интро

Неделю назад решил установить на блог счетчик-пузомерку – FeedBurner. И я был приятно удивлен, что на мои статьи подписано более двухсот человек!

Спасибо, вам, коллеги!
Спасибо за то, что уделяете внимание моим статьям и иногда активно комментируете. Кстати, о комментриях и фидбэке. До этого, практически, все мои статьи заканчивались решением той или иной задачи. Теперь же я хочу предложить вам, решить задачу самостоятельно. Задача не сложная в реализации, но требует некоторой гибкости мышления.

И так… Read the rest of this entry »

Django 1.2.1 и load_related_m2m

Интро

Думаю, многие из нас занимались оптимизацие загрузки данных из полей ManyToManyField. Задача для оптимизации проста: есть коллекция объектов с некоторым полем (полями) М2М. Необходимо выбрать данные для поля М2М одним запросом, т.е. не выполнять для каждого объекта из коллекции отдельный запрос, по загрузке однотипных данных.

Думаю, многие для этого писали собственные функции, я же пользовался load_related_m2m, найденной когда-то толи на djbook.ru, толи на сайте Ивана Сагалаева.

И вот при обновлении до Django 1.2.1 при вызове функции load_related_m2m, появилась ошибка: ‘DatabaseWrapper’ object is not callable

Исправляем

Очевидно, произошло это из-за смены интефейсов класса django.db.models.sql.Query. Для возобновления работоспособности необходимо изменить буквально пару строк:

Код


# -*- coding: utf-8 -*-
from django.db.models.sql.constants import LOOKUP_SEP
from django.db.models import sql
from django.db import connection                                               

def load_related_m2m(object_list, field):                                      

    select_fields = ['pk']
    related_field = object_list.model._meta.get_field(field)
    related_model = related_field.rel.to
    cache_name = 'all_%s' % field                                              

    for f in related_model._meta.local_fields:
        select_fields.append('%s%s%s' % (field, LOOKUP_SEP, f.column))         

    query = sql.Query(object_list.model)
    query.add_fields(select_fields)
    query.add_filter(('pk__in', [obj.pk for obj in object_list]))

    related_dict = {}
    cursor = connection.cursor()
    cursor.execute(str(query))

    for row in cursor.fetchall():
        if row[2]:
            related_dict.setdefault(row[0], []).append(related_model(*row[1:]))

    for obj in object_list:
        try:
            setattr(obj, cache_name, related_dict[obj.pk])
        except KeyError:
            setattr(obj, cache_name, [])

    return object_list

З.Ы.

А лето выдалось жаркое. Такое чувство, что в тени +40 )