【问题标题】:Django : Count, Group By and Order By with many to many fiedDjango:具有多对多字段的计数、分组依据和排序依据
【发布时间】:2019-01-14 19:59:26
【问题描述】:

我有两个模型:

class Actors(models.Model):
    name = models.CharField(max_length=128)
    ...


class Movies(models.Model)
    title = models.CharField(max_length=128)
    casting = models.ManyToManyField("actors.Actors", related_name="casting")
    ...

我正在根据他们出演的电影数量来寻找订购演员。 Django 自动生成了一个带有 actor_id 和 movies_id 的表,命名为 movies_movies_casting :

+-----+-----------+-----------+
| id  | movies_id | actors_id |
+-----+-----------+-----------+
|   1 |         1 |         1 |
|   2 |         1 |         2 |
|   3 |         2 |         1 |
|   4 |         3 |         1 |
...

这里的演员 #1 在电影 #1、#2 和 #3 中扮演。演员 #2 只在电影 #1 中出演。

这是 MySQL 中用于获取我想要的内容的请求:

SELECT actors_id, COUNT(movies_id) as count FROM movies_movies_casting GROUP BY actors_id ORDER BY count;

结果是:

+-----------+-------+
| actors_id | count |
+-----------+-------+
|        15 |    29 | // actor #15 played in 29 movies
|        12 |    21 |
|        24 |    17 |
|         3 |    16 |
|        20 |    15 |
|        21 |    14 |
...

在 Django 中使用什么请求来得到这个结果?

【问题讨论】:

  • movies_movies_casting.objects.values('actors').annotate(Count('movies'))

标签: django group-by count many-to-many sql-order-by


【解决方案1】:

试试这个,

from django.db.models import Count

Movies.objects.values('casting'
                      ).annotate(
    count=Count('id')).order_by('-count')

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多