我有以下3个Django模型(使用一些抽象):

class Person(models.Model):
    full_name = models.CharField(max_length=120, validators=[MinLengthValidator(2)])
    birth_date = models.DateField(default='1900-01-01')
    nationality = models.CharField(max_length=50, default='Unknown')

    class Meta:
        abstract = True


class Director(Person):
    years_of_experience = models.SmallIntegerField(validators=[MinValueValidator(0)], default=0)

    objects = DirectorManager()


class Actor(Person):
    is_awarded = models.BooleanField(default=False)
    last_updated = models.DateTimeField(auto_now=True)


class Movie(models.Model):
    MOVIE_GENRES = (
        ('Action', 'Action'),
        ('Comedy', 'Comedy'),
        ('Drama', 'Drama'),
        ('Other', 'Other')
    )

    title = models.CharField(max_length=150, validators=[MinLengthValidator(5)])
    genre = models.CharField(max_length=6, choices=MOVIE_GENRES, default='Other')
    rating = models.DecimalField(max_digits=3, decimal_places=1, validators=[MinValueValidator(0.0), MaxValueValidator(10.0)], default=0)
    director = models.ForeignKey(Director, on_delete=models.CASCADE)
    starring_actor = models.ForeignKey(Actor, on_delete=models.SET_NULL, blank=True, null=True)
    actors = models.ManyToManyField(Actor, related_name="actors")

正如您在上面的代码中看到的,我还有1个经理.它是这样的:

class DirectorManager(models.Manager):
    def get_directors_by_movies_count(self):
        return self.all().values("full_name").annotate(movies_num=Count("movie__director")).order_by("-movies_num", "full_name")

这是我的问题所在.我需要并输出如下内容:

<QuerySet [<Director: Francis Ford Coppola>, <Director: Akira Kurosawa>...>

相反,我收到了这样的信息:

<QuerySet [{'full_name': 'Francis Ford Coppola', 'movies_num': 2}, {'full_name': 'Akira Kurosawa', 'movies_num': 1}...]>

所以,我只需要一条记录:导演,而不是这两个全名和电影号,但我想保留相同的组和顺序逻辑. 如何做到这一点?

推荐答案

不要使用.values(),它将模型对象转换为字典,字典也是一个primitive obsession antipattern [refactoring.guru]:

from django.db.models import Count


class DirectorManager(models.Manager):
    def get_directors_by_movies_count(self):
        return self.annotate(movies_num=Count('movie')).order_by(
            '-movies_num', 'full_name'
        )

Django相关问答推荐

使用序列化器获取Django ORM auth_user. id数据

如何显示日期?

Django Form初始值不在呈现上起作用

在Python中向函数的查询列表添加条件

当前路径 **/POST 与其中任何一个都不匹配

Django中的 联合(Union) 和相交(Intersect)

有没有办法将变量传递给 Django 中的 extended模板?

将现有 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?

如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单

如何迭代模板中 SelectField 的选项?

django npm 和 node 包架构

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

Django:显示在每个页面上加载页面所花费的时间

Django 和 VirtualEnv 开发/部署最佳实践

django 管理列表中的外键显示

从表单获取模型实例而不保存

如何测试 Django QuerySets 是否相等?

使用 request.user 的 Django 和中间件始终是匿名的

AttributeError:ManyRelatedManager对象没有add属性?

如何使用 Django/nginx 部署仅限 HTTPS 的站点?