Django-уведомление: сколько наблюдаемых предметов
-
12-12-2019 - |
Вопрос
У меня есть запрос на данный момент, который возвращает количество элементов в модели, заказанной количеством людей, наблюдающих за ним.Поэтому у меня есть поле M2M, представляющее эту ссылку.
IE:
#models.py
class MyModel(models.Model):
...
watchers = models.ManyToManyField(User, blank=True)
.
Я бы посчитал количество вхождений и заказывайте их по счетчику в диспетчере по умолчанию, который затем использовался по представлению.
Теперь я иду на использование django-уведомление , используя «уведомление».«Разрешить пользователям смотреть экземпляр, если MyModel.
Так что на мой взгляд, когда пользователь поставит какой-то контент, у меня есть что-то подобное:
notification.observe(object, request.user, 'new_object')
.
Это хорошо работает.
Теперь, как я могу генерировать запрос, представляющий все объекты класса MyModel, заказанный по количеству людей «наблюдающих за ними»?
Решение
Вы можете выполнить это, используя аннотации:
from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')
. Другие советы
Проблема в том, что Django-уведомление использует общие внешние ключей.
Так что я переопределил поле моих наблюдателей:
watchers = generic.GenericRelation(notification.ObservedItem)
.
Тогда я могу получить всех наблюдателей для определенного экземпляра MyModel.
$x = MyModel.objects.get(id=1)
$x.watchers.all()
$[<ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>]
$x.watchers.count()
$3
.
близко, но нет сигары. Я хотел сделать что-то вроде этого:
MyModel.objects.annotate(count=Count('watchers')).order_by('count')
.
Что это то, что django не может сделать, в соответствии с документами .
API базы данных Django в базе данных не работает с универсалом.
Не беспокоиться, я думаю, что это, вероятно, поможет:
http://charlesleifer.com/blog/generating-aggregate -Дата - всеобщие отношения /
https://github.com/coleifer/django-generic-aggrection < / P >.
Я еще не пробовал ...