Вот хорошее объяснение: http://carcino.gen.nz/tech/cpp/struct_vs_class.php
Так, еще раз: в C++ структура идентична классу за исключением того, что у членов структуры есть общедоступная видимость по умолчанию, но у членов класса есть частная видимость по умолчанию.
У вас есть менеджеры в Django.
Используйте настраиваемый менеджер, чтобы создавать и поддерживать отношения FK .
Менеджер может обновлять счетчики по мере обновления наборов дочерних элементов.
Если вы не хотите создавать настраиваемых менеджеров, просто расширьте метод save
. Все, что вы хотите сделать для денормализации счетчиков и сумм, можно сделать в save
.
Вам не нужны сигналы. Просто продлите save
.
Первый подход (сигналы) имеет то преимущество, что ослабляет связь между моделями.
Однако поддерживать сигналы как-то сложнее, потому что зависимости менее явны (по крайней мере, на мой взгляд).
Если правильность подсчета комментариев не так важна, вы также можете подумать о задании cron, которое будет обновлять его каждые n минут.
Однако, независимо от решения, денормализация сделает более сложное обслуживание ; по этой причине я бы попытался избегать его в максимально возможной степени, решив вместо этого использовать кеши или другие методы - например, использование с comments.count в качестве cnt
в шаблонах может улучшить производительность довольно много.
Затем, если все остальное не удается, и только в этом случае, подумайте о том, что может быть лучшим подходом для решения конкретной проблемы.
Почему бы просто не получить набор комментариев и не найти количество элементов, используя метод count ()
:
count = blog_entry.comment_set.count()
Затем вы можете передать это в свой шаблон .
Или, как вариант, в самом шаблоне вы можете сделать:
{{ blog_entry.comment_set.count }}
, чтобы получить количество комментариев.
Я нашел Django-Denorm , чтобы быть полезным. Он использует триггеры уровня базы данных вместо сигналов, но, насколько я знаю, есть филиал на основе другого подхода.