Django过滤器返回许多值

时间:2011-09-12 20:53:37

标签: django filter

我是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有多个值 - 我如何才能获得所有这些值?

谢谢!

4 个答案:

答案 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}}