【问题标题】:book count per author for filtered book list in djangodjango 中过滤书单的每位作者的书数
【发布时间】:2011-05-08 11:51:46
【问题描述】:

简短的问题。 我有两个模型:

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

class Book(models.Model):
    title = models.CharField(max_length=250)
    author = models.ManyToManyField(Author)

一个视图:

def filter_books(request):
    book_list = Book.objects.filter(...)

如何在模板中显示下一个内容:

Authors in selected books:
    Author1: book_count
    Author2: book_count
    ...

【问题讨论】:

    标签: django django-templates django-views aggregate


    【解决方案1】:

    让我们一步一步构建查询。

    首先,在book_list找到有书的作者。

    authors = Author.objects.filter(book__in=book_list)
    

    诀窍是要意识到book_list 中每本书的作者都会出现一次。然后我们可以使用 annotate 来统计作者出现的次数。

    # remember to import Count!
    from django.db.models import Count
    
    authors = Author.objects.filter(book__in=book_list
              ).annotate(num_books=Count('id')
    

    在模板中,你可以这样做:

    Authors in selected books:
    {% for author in authors %}
    {{ author.name }}: {{ author.num_books }}<br />
    {% endfor %}
    

    【讨论】:

      【解决方案2】:
      #first way
      class Author(models.Model):
          name = models.CharField(max_length=250)
      
      class Book(models.Model):
          title = models.CharField(max_length=250)
          author = models.ManyToManyField(Author, related_name='bookauthor_sets')
      

      直接从模板中使用:

      {{ author.bookauthor_sets.all.count }}
      

      意思

      author.bookauthor_sets.all().count() #with python

      你也可以这样做:

      #second one
      class Author(models.Model):
          name = models.CharField(max_length=250)
      
          def get_books_count(self):
              return Book.objects.filter(author=self).count()
      

      在模板中:

      {{ author.get_books_count }}
      

      我希望这些信息对您有所帮助。

      【讨论】:

      • 这不是 OP 所要求的:author.get_books_count() 返回作者拥有的书籍总数。 OP 想要作者选择本书的数量。
      • 哦,我明白了。我可能误会了。
      猜你喜欢
      • 2020-12-13
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多