我想有类似的东西
冒险( 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)
答案 0 :(得分:1)
要执行一次查询中要实现的目标,您需要使用Count
,annotate
和values_list
我将向您展示一个代码示例,然后我将尝试解释它:
from django.db.models import Count
from your_project.models import *
Genre.objects.all().values_list('name').annotate(num_books=Count('book'))
.values_list('name')
:按名称.annotate(num_books=Count('book'))
:这是每个Genre
我的项目中有类似的模型结构,当我执行该代码时,我得到了答案:
[(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