【发布时间】:2020-06-02 19:59:05
【问题描述】:
我有一个Genre 和一个User 模型。每个Genre都有一个id和一个name,并且是多对多的关系,所以每个User喜欢0个或多个Genres。
是否有有效的查询来获取每个流派在所有用户中按后代顺序有多少喜欢?
我目前的方法有效,但效率极低,因为它必须阅读每个类型的所有用户的所有喜欢:
In [1]: genres = list(Genre.objects.values('name', 'id'))
In[2]: genres
Out[2]:
[{'id': 10, 'name': 'Rock'},
{'id': 11, 'name': 'Pop'},
{'id': 12, 'name': 'Hip hop'},
{'id': 13, 'name': 'Electronic'},
{'id': 14, 'name': 'Classical'}]
In [3]: likes_by_users = []
In [4]: users = list(User.objects.all())
In [5]: for u in users:
...: current_user_likes = []
...: likes_by_users.append(current_user_likes)
...: for lg in u.liked_genres.all():
...: current_user_likes.append(lg.pk)
In [6]: likes_by_users
Out[6]:
[[14],
[11, 12],
[11, 10, 13, 12],
[],
[13, 12, 10, 1
[10, 11]]
In [7]: counts = {}
In [8]: for g in genres:
...: counts[g['id']] = {
...: 'name' : g['name'],
...: 'likes': 0
...: }
...: for l in likes_by_users:
...: for gid in l:
...: if gid == g['id']:
...: counts[gid]['likes'] += 1
In [9]: ranking = sorted(list(counts.values()), key=lambda x : x['likes'], reverse=True)
这正是我需要的输出:
In [9]: ranking
Out[9]:
[{'likes': 4, 'name': 'Pop'},
{'likes': 3, 'name': 'Rock'},
{'likes': 3, 'name': 'Hip hop'},
{'likes': 2, 'name': 'Electronic'},
{'likes': 1, 'name': 'Classical'}]
是否有查询或其他方法可以有效地获得所需的排名?
【问题讨论】:
-
这是文档中的一个示例:
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')docs.djangoproject.com/en/3.0/ref/models/querysets/#order-by
标签: python django python-3.x django-models django-queryset