count () возвращает ноль хитов в post_save - PullRequest
0 голосов
/ 09 февраля 2012

У нас есть объект Dialog и Comment.У нас есть денормализованное поле num_comments в диалоге, чтобы отслеживать количество комментариев.Когда новый комментарий сохраняется (или удаляется), мы хотим правильно увеличить / уменьшить это значение.

# sender=Comment, called post_save and post_delete
def recalc_comments(sender, instance, created=False, **kwargs):
    # Comments that will be deleted might not have a dialog (when dialog gets deleted)
    if not hasattr(instance, "dialog"):
        return

    dialog = instance.dialog
    dialog.update(
        num_comments = sender.public.filter(dialog=dialog).count(),
        num_commentators = sender.public.filter(dialog=dialog).aggregate(c=Count('user',     distinct=True))["c"],
)

Проблема, которая начала появляться, состоит в том, что запрос для num_comments возвращает ноль для первого опубликованного комментария.Это происходит не каждый раз, а только в случаях с aprox.> 1000 комментариев в наборе результатов (не так много, я знаю ...).

Может ли быть так, что комментарий еще не был сохранен в базе данных при выполнении count ()?Чтобы еще больше усложнить ситуацию, мы используем Johnny Cache (с memcached) в качестве слоя между ORM и базой данных.

Любая информация будет принята с благодарностью!

1 Ответ

0 голосов
/ 12 февраля 2012

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

Как сказано в документации:

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

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

CompositionField - поле модели django, предоставляющее интерфейс для денормализации данных.

Вы также можете использовать этот ярлык ForeignCountField .Это помогает подсчитать количество объектов, связанных с Foreignkey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...