首页 > 解决方案 > 如何在 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]

标签: pythonsqldjango

解决方案


您可以使用.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

开始,您可以使用.alias(…)[Django-doc]来防止将其计算为列和ORDER BY子句:

from django.db.models import Count

Movies.objects.alias(
    noccurence=Count('mymovies')
).order_by('-noccurence')

推荐阅读