Планы
2010-03-06 22:15:07
Окончательно понял, что ресурсов по дальнейшему переводу в ближайшее время у меня так и не появится. Что ж, будем менять формат сайта. Он по-прежнему останется ориентированным на новичков. Но и заматеревших джангистов тоже приятно видеть на нашем канале.
Исходники перевода будут выложены в формате DocBook XML в Git. Патчи с исправлениями и, может быть, переводами оставшихся глав будут приниматься, проверяться и выкладываться на сайт. Думаю, это поможет всем желающим поучаствовать в данном проекте.
Выложена шестая глава
2009-11-12 19:52:46
Несмотря на страшную загруженность была завершена работа по проверке перевода шестой главы, который был предоставлен Дмитрием aka Alerion. Огромное ему спасибо за проделанную работу.
Седьмая глава переведена
2009-09-03 12:05:29
Данная глава была полностью переработана авторами, поэтому она потребовала значительно больше времени на её перевод. Простая коррекция предыдущей версии главы здесь не помогала. Читайте и присылайте уведомления о замеченных ошибках.
P.S. Скоро обещают прислать перевод шестой главы...
Пятая глава переведена
2009-08-26 21:45:40
На фоне решения сложной (для меня) проблемы с дизайном в стороннего проекта, сегодня за день перевёл пятую главу книги. Всё выложено на сайт. Я пропустил совсем немного английского текста. Места, к которым я планирую вернуться, отмечены словом FIXME. Переводы такого текста можно присылать через жалобную систему.
Книга о Django
2009-08-22 22:10:20
Камрад Plesser любезно предоставил книгу Django. Разработка веб-приложений на Python. Я выделил время на её изучение. Первое время, я даже начал подумывать о завершении работы над переводом второй версии DjangoBook. Но дочитав, понял, что надо продолжать.
Моё резюме книги: Очень хороший материал для человека решившего перейти на Django/Python с других платформ. Материал подаётся наглядно и достаточно подробно. Разбирается работа нескольких приложений: блог, фотогалерея и так далее.
Но!
Книгу писали до выхода версии Django 1.0. Там есть моменты, которые не соответствуют действительности (я имею в виду версию из SVN). И вообще, после года работы с Django понимаешь, что на самом деле проекты надо делать не так как пишут в книжках. Так что, перевод DjangoBook будет продолжен. А там можно будет подумать о книге «Django: Используем по-взрослому.»
|
Подгрузка связанных моделей (многие-ко-многим)
(c) 2009 alerion.um с гмыла
Select_related не работает для обратных связей. В мануале Django, в примере, используется обычный менеджер для обратных связаных таблиц, который посылает запрос при обращении к ним. Можно, конечно, использовать raw sql, когда нет доступа к методам моделей, например, get_absolute_url и др. Функция load_related_m2m для обьектов в object_list получает все связаные(m2m) через поле field обьекты и заносит в поле "all_" % field обьекта. В результате получаем всего один лишний запрос на каждую связаную таблицу.
Файл models.py
class Post(models.Model):
name = models.CharField(max_length=255)
tags = models.ManyToManyField('Tag', blank=True)
genres = models.ManyToManyField('Genre', blank=True)
class Tag(models.Model):
name = models.CharField(max_length=255, unique=True)
class Genre(models.Model):
name = models.CharField(max_length=255, unique=True)
Файл views.py
def test(request):
from lib import load_related_m2m
from app.models import Post
p = Post.objects.all()[:10]
load_related_m2m(p, 'tags')
load_related_m2m(p, 'genres')
return {'posts': p}
Файл test.html
{% for item in posts %}
<h3>{{ item.name }}</h3><br/>
Теги:
{% for tag in item.all_tags %}
{{ tag.name }},
{% endfor %}<br/>
Жанры:
{% for g in item.all_genres %}
{{ g.name }},
{% endfor %}<br/><br/>
{% endfor %}
Файл lib.py
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, connection)
query.add_fields(select_fields)
query.add_filter(('pk__in', [obj.pk for obj in object_list]))
related_dict = {}
for row in query.results_iter():
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
Добавлено 20 июля 2010
Для Django 1.2 данный код был доработан Анатолием Лариным. Django 1.2.1 и load_related_m2m
|
Мой луч
Многообразие света
|
|
|
на поддержку перевода
|
|
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061
|