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

Ловушка при подсчете связанных объектов в 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

Пробуем 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

Отладка 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

Вложенные 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

Кеширование 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

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

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

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

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

1. __unicode__ ...

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