Django Annotate - 获取不同字段值的列表
Django Annotate - get list of distinct field values
我有 3 个模型 - Book
、Page
和 Language
。
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)
Book
和 Page
对象之间存在一对多关系。书中的某些页面可能使用不同的语言,因此我在 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
。
Link:
如果你使用rest-framework,你可以使用Serializer。
我有 3 个模型 - Book
、Page
和 Language
。
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)
Book
和 Page
对象之间存在一对多关系。书中的某些页面可能使用不同的语言,因此我在 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
。
Link:
如果你使用rest-framework,你可以使用Serializer。