我是django的新手,我认为这是一个简单的问题 -
我有一个中间类,编码如下 -
class Link_Book_Course(models.Model):
book = models.ForeignKey(Book)
course = models.ForeignKey(Course)
image = models.CharField(max_length = 200, null=True)
rating = models.CharField(max_length = 200,null=True)
def __unicode__(self):
return self.title
def save(self):
self.date_created = datetime.now()
super(Link_Book_Course,self).save()
我正在打这个电话,因为我想要拥有书籍的所有作者(Book是作为CharField的另一个作者模型)
storeOfAuthorNames = Link_Book_Course.objects.filter(book__author)
但是,它不会返回所有作者的querySet,实际上它会抛出错误。
我认为这是因为book__author有多个值 - 我如何才能获得所有这些值?
谢谢!
答案 0 :(得分:3)
我认为你没有使用正确的queryset方法。 filter()
按其参数过滤 - 因此预期用法为:
poe = Author.objects.get(name='Edgar Allen Poe')
course_books_by_poe = Link_Book_Course.objects.filter(book__author=poe)
看起来你正试图在特定课程(或者所有课程?)中提取所有书籍作者的名单。也许您正在寻找.values()
或values_list()
?
all_authors_in_courses = Link_Book_Course.objects.values_list(
'book__author', flat=True
).distinct()
(编辑:根据@ ftartaggia的建议更新)
答案 1 :(得分:1)
正如其他人已经解释的那样,使用filter方法是获取整个对象集的一个子集,而不返回其他模型的实例(无论是否有相关对象)
如果您想从django ORM返回Author models实例,并且您可以使用聚合API,那么您可能希望执行以下操作:
from django.db.models import Count
Author.objects.annotate(num_books=Count('book')).filter(num_books__gt=1)
答案 2 :(得分:0)
您尝试使用的过滤器方法或多或少地转换为SQL,如下所示:
SELECT * FROM Link_Book_Course INNER JOIN Book ON(...)WHERE Book.author =;
因此,当您看到您的查询具有不完整的where子句时。
无论如何,这不是您正在寻找的查询。
类似的东西(假设作者是Book的简单文本字段,而您只想要从Link_Book_Course实例引用的书籍作者):
Book.objects.filter(pk__in = Link_Book_Course.objects.all()。values_list(“book”,flat = True))。values_list(“author”,flat = True)
答案 3 :(得分:0)
首先,过滤器语句会过滤匹配某个模式的字段。因此,如果Book有一个简单的ForeignKey to Author,你可以拥有
storeOfAuthorNames = Link_Book_Course.objects.filter(book__author="Stephen King")
,但不仅仅是
storeOfAuthorNames = Link_Book_Course.objects.filter(book__author)
。
一旦你过了那个,我猜猜书的作者是ManyToManyField
而不是ForeignKey
(因为一本书可以有多个作者,作者可以发表多本书吗?)只有filter(book__author="Stephen King")
,仅仅Link_Book_Course.objects.filter(book_author__in=myBookObject.author.all())
仍然不够。试试{{1}}