python - 如何在 DJANGO 中按最大数量的相同记录排序
问题描述
我想根据 MyMovies 模型中元组的最大出现次数按 Movies 模型中的电影排序。
模型.py
class Movies(models.Model):
mid = models.CharField(max_length=255, primary_key=True)
title = models.CharField(max_length=255, null=True, blank=True)
rating = models.CharField(max_length=5, null=True, blank=True)
type = models.CharField(max_length=255, null=True, blank=True)
genre = models.CharField(max_length=255, null=True, blank=True)
rdate = models.CharField(max_length=255, null=True, blank=True)
language = models.CharField(max_length=255, null=True, blank=True)
cover = models.CharField(max_length=255, null=True, blank=True)
description = models.TextField(null=True, blank=True)
sequal = models.CharField(max_length=255, null=True, blank=True)
trailer = models.CharField(max_length=255, null=True, blank=True)
year = models.CharField(max_length=5, null=True, blank=True)
objects = models.Manager()
def __str__(self) -> str:
return self.title
class MyMovies(models.Model):
mid = models.ForeignKey(Movies, on_delete=CASCADE)
uid = models.ForeignKey(User, on_delete=CASCADE, null=True, blank=True)
watched = models.BooleanField()
date = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
视图.py
def showIndexPage(request):
trending = list(MyMovies.objects.all().annotate(max_mid=Max(COUNT(mid))).order_by('-max_mid'))
return render(request, 'index.html', {'trending': trending})
在上面的代码中,MyMovies 是我的模型,其中外键 mid 引用了 Movie 模型。
因此,如果在 MyMovies 中有 2 部电影带有 mid 1、4 部电影带有 mid 2 和 1 部电影带有 mid 3
那么结果应该是一个按 no 排序的 Movies 属性列表(趋势)。特定电影 ID 的出现次数:
趋势 = [2, 1, 3]
解决方案
您可以使用.annotate()
[Django-doc]然后使用.order_by(…)
[Django-doc]:
from django.db.models import Count
Movies.objects.annotate(
noccurence=Count('mymovies')
).order_by('-noccurence')
由此Movies
产生的QuerySet
将有一个额外的属性,该属性.noccurence
具有相关的数量MyMovies
。
从django-3.2开始,您可以使用.alias(…)
[Django-doc]来防止将其计算为列和ORDER BY
子句:
from django.db.models import Count
Movies.objects.alias(
noccurence=Count('mymovies')
).order_by('-noccurence')
推荐阅读
- ios - iOS 顶部导航栏
- assembly - 如何在仅使用 mov 指令的情况下反转 16 位寄存器 di、si、bp 和 sp 的顺序?
- macos - 无法禁用代理以在 OS X 上安装 Homebrew
- puppeteer - 使用 button.click() 提交后等待表单响应
- android - 在 AndroidX Fragment 中禁用后退按钮
- java - 将对象中的值获取到地图中
- python - 根据 textContent 获取 CSS-selector 或 XPath
- c++ - 如何使用 cmake 从 Visual Studio 构建 ia32 解决方案
- reactjs - 调度动作后如何防止redux生成相同属性的子对象
- jquery - Wampserver 无法连接到 API