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

时间:2018-11-01 18:59:32

标签: django django-models django-queryset django-annotate

我有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对象之间存在一对多关系。一本书中的某些页面可能使用不同的语言,因此我在ForeignKey模型中而非在Page模型中添加了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']。

这可行吗?

1 个答案:

答案 0 :(得分:1)

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

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

如果使用其余框架,则可以使用序列化器。