Статьи с тегом database
Ловушка при подсчете связанных объектов в 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 ...
Пробуем JSON в Django и PostgreSQL (и сравниваем с MongoDB)
В Django 1.9 будет добавлено поле JSONField, его можно использовать с базой данных PostgreSQL >= 9.4. Давайте попробуем с ним поработать и оценить, насколько оно удобно.
На данный момент доступна альфа версия django 1.9, финальная запланирована на декабрь 2015. Установить альфа версию можно так:
pip install --pre 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 запросы. Далее опишу, как этого добиться.
Кстати, если вы ...
Timestamp и ObjectId в mongoDB
У каждой записи в mongoDB есть поле _id
, которое должно быть уникальным в коллекции.
По умолчанию тип этого поля - ObjectId, и оно присваивается автоматически, если поле не заполнено при сохранении.
Давайте рассмотрим, что из себя представляет тип ObjectId.
Это 12 байт, которые состоят из:
- 4 байта, содержащие количество секунд с начала Unix эпохи
- 3 байта, содержащие идентификатор устройства
- 2 байта, содержащие id процесса
- 3 байта, содержащие счетчик, который стартует со случайного значения
Как видим, первые ...
Вложенные 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 ...
Что нужно знать об индексах в mongodb
Недавно закончил курс "M101P: MongoDB for Developers" (он периодически повторяется, например следующий стартует в апреле). В процессе прохождения натолкнулся на некоторые интересные моменты.
1. Выбор индекса для запроса.
Допустим у нас коллекция с такими данными:
{ "_id" : ..., "a" : 81810, "b" : 97482, "c" : 44288 }
{ "_id" : ..., "a" : 11734, "b" : 27893, "c" : 19485 }
// и т.д.
Всего 99999 объектов. У коллекции есть индексы:
db.foo.ensureIndex({a: 1, b: 1, c: 1})
db.foo.ensureIndex({c: -1})
Вопрос: какой ...
Кеширование queryset.count в django
Как-то обнаружил, что у меня идут несколько одинаковых запросов вида 'SELECT COUNT(*) ...'. Оказалось (да, для меня это было новостью :) ), что метод queryset.count()
в джанго кешируется по особому. Но лучше начать рассказ издалека.
Как известно, объекты queryset
у ORM django являются "ленивыми", а так же кешируются.
Т.е., преподолжим у нас такая модель:
class Item(models.Model):
name = models.CharField(max_length=50)
Тогда при создании запроса фактически обращения к БД не происходит (отсюда название lazy ...
Оптимизация админки django
Как известно, чем меньше запросов к базе данных делает сайт, тем лучше производительность. Обычно админка - часть сайта с меньшим трафиком, но все же хорошо, если от туда не идут лишние запросы. Это и приятней в пользовании, т.к. страница отдается быстрее, и все-таки разгружает сервер.
В этом посте я рассмотрю некоторые способы уменьшения количества запросов из админки к БД при использовании __unicode__
, содержащего поля связанного объекта (ForeignKey). Думаю, глядя на примеры станет понятнее.