Django Annotate - 获取不同字段值的列表

Posted

技术标签:

【中文标题】Django Annotate - 获取不同字段值的列表【英文标题】:Django Annotate - get list of distinct field values 【发布时间】:2019-04-06 01:20:42 【问题描述】:

我有 3 个模型 - BookPageLanguage

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)

class Page(models.Model):
    image = models.ImageField(upload_to='Uploaded_images')
    language = models.ForiegnKey(Language, models.CASCADE)
    book = models.ForeignKey(Book, models.CASCADE)

class Language(models.Model):
    name = models.CharField(max_length=20)

BookPage 对象之间存在一对多关系。书中的某些页面可能使用不同的语言,因此我在 Page 模型中添加了 ForeignKey,而不是在 Book 模型中。

我想获取所有书籍的列表及其页面所用的语言。

我试过了:

books = Page.objects.annotate(
        name=F('book__title')
    ).values(
        'name', 'book_id'
    ).distinct(
    ).annotate(
        page_count=Count('id'),
    ).values(
        'name', 'book_id', 'language'
    )

如果书中有 2 种语言,我会得到相同书名的 2 个条目。我只需要这本书的 1 个条目,并且能够将其语言显示为列表。

例如:如果有一本书的页面使用西班牙语和英语这两种语言中的任何一种,我想将书名和其中的语言提取为 ['English', 'Spanish']。

这可行吗?

【问题讨论】:

如果你使用 Postgres,也许你需要开始从class Book 获取数据并使用ArrayAgg。链接:***.com/questions/43203014/…。如果你使用rest-framework,你可以使用Serializer。 这有帮助!请将此写为答案,以便更明显。 【参考方案1】:

如果你使用 Postgres,也许你需要从class Book 获取数据并使用ArrayAgg

链接:Django queryset annotate field to be a list/queryset

如果你使用rest-framework,你可以使用Serializer。

【讨论】:

以上是关于Django Annotate - 获取不同字段值的列表的主要内容,如果未能解决你的问题,请参考以下文章

Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?

072:Django数据库ORM聚合函数详解-aggregate和annotate

通过连接获取所有字段。 DJANGO

Django ORM命令获取没有空字段的不同值

Django Aggregation - 试图返回两个值

Django获取模板中每个选择字段的总数