Статьи с тегом django

Ловушка при подсчете связанных объектов в Django

Ловушка при подсчете связанных объектов в Django

Задача: для каждого объекта подсчитать количество связанных объектов, удовлетворяющих определенному условию.

Пример:

class Category(models.Model):
    title = models.CharField(max_length=50)

class Article(models.Model):
    title = models.CharField(max_length=50)
    category = models.ForeignKey(Category)
    approved_at = models.DateTimeField(blank=True, null=True)

Видим, что поле Article.approved_at хранит время одобрения статьи, причем оно может быть пустым (т.е. NULL в базе данных).

Создадим тестовые данные:

from django.utils import timezone

c1 = Category.objects.create(title='c1 ...

Добавлено 2017-01-14

Django: сигнал или метод модели?

Django: сигнал или метод модели?

Когда нужно написать какой-либо функционал, который должен быть выполнен при сохранении django модели, у меня всегда возникал вопрос - где его лучше реализовать. В сигнале или в методе save() модели? Давайте разберемся, что и в каких ситуациях более удобно.

В каких случаях использовать методы модели save(), delete()?

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

Часто приводят ...

Добавлено 2016-08-01

Пробуем JSON в Django и PostgreSQL (и сравниваем с MongoDB)

Пробуем JSON в Django и PostgreSQL

В Django 1.9 будет добавлено поле JSONField, его можно использовать с базой данных PostgreSQL >= 9.4. Давайте попробуем с ним поработать и оценить, насколько оно удобно.

На данный момент доступна альфа версия django 1.9, финальная запланирована на декабрь 2015. Установить альфа версию можно так:

pip install --pre django

Итак представим, что у нас есть интернет магазин, в котором мы предлагаем товары разных типов. Например, ноутбуки и футболки. Очевидно, что у таких товаров будет ...

Добавлено 2015-09-30

OAuth и django rest framework

OAuth и django rest framework

Тема избитая, но мне не удалось найти готового решения, которое полностью бы меня устроило. Поэтому пишу сам :).

Итак, у нас есть "одностраничный" веб сайт, который общается с бекендом посредством REST API. Клиентская часть может быть написана с помощью ember, angularjs или чего-то подобного. Бекенд - django rest framework (DRF). И есть тривиальная задача - добавить вход через социальные сети (OAuth протокол).

Как бы это выглядело в случае обычного (олд-скульного) сайта? Пользователь нажимает логин, открывается страница социальной сети ...

Добавлено 2015-07-18

Отладка SQL в django тестах

Отладка SQL в django тестах

В django тестах можно замерять количество сделанных SQL запросов:

def test_home(self):
    with self.assertNumQueries(1):
        response = self.client.get('/')
    self.assertEqual(response.status_code, 200)

Если код в контексте assertNumQueries сделает иное количество обращений к БД, чем ожидается (здесь 1), то тест выдает ошибку. Но когда такой тест не проходит, бывает трудно определить лишний отправленный запрос. Для отладки такого случая удобно вывести в консоль отправленные SQL запросы. Далее опишу, как этого добиться.

Кстати, если вы ...

Добавлено 2015-03-04

Подключение celery к django

Подключение celery к django

Для подключения celery к новому проекту так или иначе приходится подглядывать в предыдущие, чтобы вспомнить необходимые шаги: какие настройки задавать, как запускать, как останавливать и т.д.

Хочу собрать все в одном месте.

Что нужно получить в итоге

  1. Посредством celery добавить возможность django проекту выполнять задачи в фоне, чтобы не загружать текущий python процесс. Пример таких задач: отправка емейлов, работа со сторонним апи, долгие вычисления и т.д.
  2. В качестве брокера используем redis.
  3. В админке ...

Добавлено 2014-11-02

Вложенные SQL запросы в Django

Вложенные SQL запросы в Django

Вы знали, что Django ORM умеет делать вложенные SQL запросы? К своему стыду я узнал это не так давно.

Допустим, у нас есть такие модели питомника (Nursery) и питомца (Pet):

class Nursery(models.Model):
    title = models.CharField(max_length=50)

class Pet(models.Model):
    name = models.CharField(max_length=50)
    nursery = models.ForeignKey(Nursery, related_name='pets')

Нам нужно получить всех питомцев (Pet), которые находятся в заданных питомниках (Nursery). Например в питомниках, title который начинается с "Moscow":

nurseries ...

Добавлено 2014-09-09

Отправка писем в django проекте с помощью сервиса mandrill

Отправка писем в django проекте с помощью сервиса mandrill

Отправлять email сообщения с сервера можно просто по SMTP протоколу. Но есть другой способ - через специальные сервисы рассылки. Про один такой, mandrill.com, я немного расскажу.

Преимущества относительно SMTP

  • Подробная статистика отправленных писем. Сколько писем отправлено, кому, когда. Сколько писем открыли, какие ссылки нажимали.
  • Шаблоны писем. Их можно редактировать через сервис mandrill, т.о. образом не нужно ничего придумывать в админке django. В шаблоне можно использовать переменные, задавать тему письма, даже адрес отправителя. Из ...

Добавлено 2014-03-18

Django проект: с нуля до работающего сервера

В этом посте хочу описать свой опыт создания и запуска django проекта на VPS-хостинге.

Разделим задачу на этапы:

  1. Создание django-проекта
  2. Настройка деплоя
  3. Настройка сервера (установка нужных библиотек)
  4. Деплой проекта

Создание django-проекта

Итак. Пусть наш проект называется myproject. Создадим его на локальном компьютере. Будем считать, что python у нас в системе установлен. Для начала нам понадобятся pip и virtualenv (если еще не стоят).

Создаем виртуальное окружение:

virtualenv venv-myproject

Активируем его:

# на *nix системе
source venv-myproject/bin ...

Добавлено 2013-11-13

Настройки логов для django

Рассмотрим дефолтные настройки логов в django и попробуем их сделать максимально удобными.

Вот что есть в settings.py после команды django-admin.py startproject project_name (django 1.5):

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging ...

Добавлено 2013-09-26

Кеширование queryset.count в django

Кеширование queryset.count в django

Как-то обнаружил, что у меня идут несколько одинаковых запросов вида 'SELECT COUNT(*) ...'. Оказалось (да, для меня это было новостью :) ), что метод queryset.count() в джанго кешируется по особому. Но лучше начать рассказ издалека.

Как известно, объекты queryset у ORM django являются "ленивыми", а так же кешируются.

Т.е., преподолжим у нас такая модель:

class Item(models.Model):
    name = models.CharField(max_length=50)

Тогда при создании запроса фактически обращения к БД не происходит (отсюда название lazy ...

Добавлено 2013-07-11

Парсинг url'а, содержащего unicode параметры, используя urlparse.parse_qs

Задача: получить словарь параметров URL'a. Например, имеем адрес:

http://example.com/?key=value&a=b

и нужно получить такой словарь:

{'key': ['value'], 'a': ['b']}

Тут значения являются списками, т.к. у одного ключа может быть несколько значений:

In: http://example.com/?key=value&a=b&a=c
Out: {'key': ['value'], 'a': ['b', 'c']}

В python'е для этих целей есть функция urlparse.parse_qs, которая делает следующее:

>>> import urlparse
>>> query = "key=value&a=b"
>>> urlparse ...

Добавлено 2013-05-22

Оптимизация админки django

Оптимизация админки django

Как известно, чем меньше запросов к базе данных делает сайт, тем лучше производительность. Обычно админка - часть сайта с меньшим трафиком, но все же хорошо, если от туда не идут лишние запросы. Это и приятней в пользовании, т.к. страница отдается быстрее, и все-таки разгружает сервер.

В этом посте я рассмотрю некоторые способы уменьшения количества запросов из админки к БД при использовании __unicode__, содержащего поля связанного объекта (ForeignKey). Думаю, глядя на примеры станет понятнее.

1. __unicode__ ...

Добавлено 2013-04-12

Многоязычный сайт на django без редиректов

Начиная с django 1.4, можно задать префикс для url для каждого включенного языка. К примеру, мы хотим сайт, который будет иметь русскую и английскую версию.

Для этого добавляем в settings.py:

    # язык сайта по умолчанию, если не удалось определить язык другими способами
    LANGUAGE_CODE = 'ru'

    # список доступных языков
    LANGUAGES = (
        ('ru', 'Russian'),
        ('en', 'English'),
    )

    # включаем систему перевода django
    USE_I18N = True

    # указываем, где лежат файлы перевода
    LOCALE_PATHS = (
        os.path.join(PROJECT_DIR, 'locale'),
    )

    # Добавляем LocaleMiddleware
    MIDDLEWARE_CLASSES = (
       # ...
       'django.middleware ...

Добавлено 2013-02-26

MobileESP: Скрипт определения мобильного устройства посетителя

Скрипт полезен, если вы хотите показывать разные версии сайта для обычных компьютеров и мобильных устройств. Большое количество методов для определения вида девайса. Доступен на разных языках программирования, включая python. Собственно порт на python был написан мной по просьбе freelance заказчика.

Так его можно использовать в django проекте:

from mobileesp import mdetect

user_agent = request.META.get("HTTP_USER_AGENT")
http_accept = request.META.get("HTTP_ACCEPT")
if user_agent and http_accept:
    agent = mdetect.UAgentInfo(userAgent=user_agent, httpAccept=http_accept)
    # устройство посетителя - новый ...

Добавлено 2012-11-29

Отладка django проекта с помощью встроенного python отладчика pdb

Я использую sublime-text в качестве редактора python кода. В нем нет встроенного отладчика, поэтому для отладки django проектов я в основном делал так:

print var_name

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

Это можно сделать с помощью встроенного python отладчика pdb:

import pdb; pdb.set_trace()

Т.е. мы вставляем эту строку в то место в коде, где ...

Добавлено 2012-11-18

Этот сайт

Особенности:

  • работает на python+django
  • дизайн twitter bootstrap
  • в основе мой форк django-articles-transmeta блог-движка django-articles. В форке добавлена возможность перевода статей (джанго моделей)
  • работает в облаке на openshift
  • есть полнотекстовый поиск, сделан с помощью haystack + whoosh
  • многоязычность (русский и английский)
  • код лежит на github

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

Добавлено 2012-08-28