如何获取按中间模型的属性分组的项目数

时间:2014-11-03 10:09:41

标签: django django-orm

我想有类似的东西

冒险( 4 )|科幻( 12

这是书店里的书籍,以当地价格挂钩。

说,霍比特人在亚马逊5美元,在巴恩斯6美元。因此,如果我在亚马逊上市这些书籍,我会将冒险(1)作为亚马逊中指定价格的书籍数量。

如果我喜欢这样,我会得到正确的类型:

for u in Bookshop.objects.get(pk=1).BookBookshopLink_set.all():
    print u.book.genre

会打印,例如:

Sci-fi
Sci-fi
Adventure

以下是模型:

from parler.models import TranslatableModel, TranslatedFields
from parler.managers import TranslationManager

class Genre(TranslatableModel):
    translations = TranslatedFields(
        name=models.CharField(max_length=200),
        slug=models.SlugField(),
        description=models.TextField(blank=True),
        meta={'unique_together': [('language_code', 'slug')]},
    )

    published = models.BooleanField(default=False)


class Book(TranslatableModel):
    translations = TranslatedFields(
        name=models.CharField(max_length=200),
        slug=models.SlugField(),
        description=models.TextField(blank=True),
        meta={'unique_together': [('language_code', 'slug')]},
    )

    genre = models.ForeignKey(Genre, blank=True, null=True)
    published = models.BooleanField(default=False)


class Bookshop(TranslatableModel):
    translations = TranslatedFields(
        name=models.CharField(max_length=200),
        description=models.TextField(_('Description'), default='', blank=True),
        slug=models.SlugField(),
        meta={'unique_together': [('slug', 'language_code')]},
    )

    booklist = models.ManyToManyField(Book, blank=True, through='BookBookshopLink')


class BookBookshopLink(TranslatableModel):
    bookshop = models.ForeignKey(Bookshop)
    book = models.ForeignKey(Book)
    price = models.IntegerField(blank=True, null=True)

2 个答案:

答案 0 :(得分:1)

要执行一次查询中要实现的目标,您需要使用Countannotatevalues_list

我将向您展示一个代码示例,然后我将尝试解释它:

from django.db.models import Count
from your_project.models import *

Genre.objects.all().values_list('name').annotate(num_books=Count('book'))
  1. .values_list('name'):按名称
  2. 返回所有类型的列表
  3. .annotate(num_books=Count('book')):这是每个Genre
  4. 的计数书

    我的项目中有类似的模型结构,当我执行该代码时,我得到了答案:

    [(u'GENRE_NAME', 13), (u'GENRE_NAME', 14), (u'GENRE_NAME', 0),...]
    

    您可以解析此查询的输出以符合您的期望

    我还建议您查看官方文档Django Agreggation

答案 1 :(得分:0)

这会循环播放所有类型并打印出其中有多少类型。 即使类型中有0个。

for a_genre in Gendre.objects.all():
    print Book.objects.filter(genre=a_genre).count()

如果你想要它打印出类型aswel

for a_genre in Gendre.objects.all():
    print "%s (%d)" % (a_genre, Book.objects.filter(genre=a_genre).count())

django中过滤器的文档:https://docs.djangoproject.com/en/1.7/topics/db/queries/#retrieving-specific-objects-with-filters