Django 从许多表中创建直方图

Django 从许多表中创建直方图,django,django-forms,many-to-many,Django,Django Forms,Many To Many,在上面的模型中,我记录了作者姓名的位置 对于给定的书籍(请参见BookAuthor表中的position字段),即想象“Paulo Coelho”在第X本书上是“第一作者”,在第Y本书上是“第二作者”,在第Z本书上是“第三作者” 对于每个作者,我想创建一个直方图,其中 柱状图bin统计所有书籍中作者姓名出现在“第i个”位置的次数。例如: class Author(models.Model): name = models.CharField(max_length=100) class B

在上面的模型中,我记录了作者姓名的位置 对于给定的书籍(请参见
BookAuthor
表中的
position
字段),即想象“Paulo Coelho”在第X本书上是“第一作者”,在第Y本书上是“第二作者”,在第Z本书上是“第三作者”

对于每个作者,我想创建一个直方图,其中 柱状图bin统计所有书籍中作者姓名出现在“第i个”位置的次数。例如:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    isbn = models.CharField(max_length=9)
    name = models.CharField(max_length=300)
    authors = models.ManyToManyField(Author, through='BookAuthor')

class BookAuthor(models.Model):
    book = models.ForeignKey('Book', on_delete=models.CASCADE)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    position = models.IntegerField()
这意味着保罗·科埃略是第一作者的3倍,第二作者的1倍,第三作者的1倍。
马里奥·巴尔加斯·略萨(Mario Vargas Llosa)作为第一作者出现了4倍,作为第二作者出现了2倍,作为第三作者出现了0倍。您可以假设每本书最多有5位作者。

我想您可以通过以下方式获得一本包含您要查找的数据的词典:

AuthorName, No1stAuth, No2ndAuth, No3rdAuth
--------------------------------------------
Paulo Coelho, 3, 1, 1
Mario Vargas Llosa, 4, 2, 0
然后,您可以将此词典转换回列表

result = BookAuthor.objects.values('author','position ')
         .annotate(count=Count('id'))