Я думаю, что вы делаете здесь слишком сложно, и, вероятно, вы слишком много работаете сами.
Вы можете посчитать количество различных ip_address
es с параметром distinct=True
объекта Count
[Django-doc], как:
from django.db.models import Count
ObjectViewed.objects.values('object_id', 'content_type').annotate(
c=Count(<b>'ip_address', distinct=True</b>)
).order_by('-c')
Мы можем использовать это, чтобы эффективно упорядочить наши NewsPost
как:
from django.contrib.contenttypes.models import ContentType
from django.db.models import Count
views = <b>dict(</b>ObjectViewed.objects.filter(
content_type=get_object_for_this_type(NewsPost)
).values_list('object_id').annotate(
c=Count(<b>'ip_address', distinct=True</b>)
).order_by('object_id')<b>)</b>
тогда мы можем упорядочить элементы на уровне Django / Python, например:
<b>my_newsposts = sorted(</b>NewsPost.objects.all()<b>, key=views.get, reverse=True)</b>
Таким образом, здесь мы сначала фильтруем, чтобы получить только отдельные представления для NewsPost
объектов, мы помещаем их в словарь с именем views
, затем мы сортируем NewsPost
объекты с этими представлениями в обратном порядке. заказ.