2016-03-31 35 views
0
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() 

在上面的模型创建直方图,我录制的位置,一个作家 对于给定的书的名字(见BookAuthorposition场),即想象“保罗·科埃略”被“第一作者”在书X上,“第二作者”在书Y上,“第三作者”在书Z上。从多对多表

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

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

这意味着保罗科埃略出现3倍作为第一作者,1个为第二作者,和1x为第三作者。 Mario Vargas Llosa以第一作者的身份出现4次,作为第二作者的2次以及作为第三作者的0x。你可以假设,每本书最多有5位作者。

回答

0

我想你可以得到你正在寻找通过数据字典:

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

然后,你可以改造这个字典回列表。