Вопрос

У меня есть запрос на данный момент, который возвращает количество элементов в модели, заказанной количеством людей, наблюдающих за ним.Поэтому у меня есть поле 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 -Дата - всеобщие отношения /

repo здесь:

https://github.com/coleifer/django-generic-aggrection < / P >.

Я еще не пробовал ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top