从ManyToMany表创建直方图

时间:2016-03-31 13:39:15

标签: django django-forms many-to-many

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()

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

对于每个作者,我想创建一个直方图,其中每个 直方图bin计算作者姓名出现在" ith"所有书籍的位置。例如:

AuthorName, No1stAuth, No2ndAuth, No3rdAuth
--------------------------------------------
Paulo Coelho, 3, 1, 1
Mario Vargas Llosa, 4, 2, 0

这意味着Paulo Coelho作为第一作者出现3倍,作为第二作者出现1倍,作为第三作者出现1倍。 Mario Vargas Llosa作为第一作者出现了4倍,作为第二作者出现了2倍,作为第三作者出现了0x。你可以假设,每本书最多有5位作者。

1 个答案:

答案 0 :(得分:0)

我猜您可以通过以下方式获取包含所需数据的字典:

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

然后你可以将这个字典转换回一个列表。