【问题标题】:Django Filter Return Many ValuesDjango过滤器返回许多值
【发布时间】:2011-09-13 06:50:00
【问题描述】:

我是 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)

但是,它并没有返回所有作者的查询集,事实上,它会抛出一个错误。

我认为这是因为 book__author 有多个值 - 我怎样才能获得所有这些值?

谢谢!

【问题讨论】:

  • 您要查询给定书籍的所有作者,还是要查询 Link_Book_Course 中至少一本书的所有作者?

标签: django filter


【解决方案1】:

我认为您使用的查询集方法不正确。 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 的建议更新)

【讨论】:

  • 如何在最后一条语句中添加 distinct() 并在方便时使用 values_list('book_author', flat=True)?
【解决方案2】:

正如其他人已经解释的那样,使用过滤器方法是获取整个对象集的子集,并且不返回其他模型的实例(无论是否相关对象)

如果您想从 django ORM 获取作者模型实例并且可以使用聚合 API,那么您可能需要执行以下操作:

from django.db.models import Count
Author.objects.annotate(num_books=Count('book')).filter(num_books__gt=1)

【讨论】:

    【解决方案3】:

    您尝试使用的过滤器方法或多或少地转换为 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)

    【讨论】:

    • 我不推荐使用这样的查询,效率很低。
    • 如果想要获得作者姓名列表(正如他所说):)
    【解决方案4】:

    首先,过滤器语句过滤匹配某个模式的字段。因此,如果 Book 有一个简单的外键到作者,你可以
    storeOfAuthorNames = Link_Book_Course.objects.filter(book__author="Stephen King"),但不仅仅是
    storeOfAuthorNames = Link_Book_Course.objects.filter(book__author).

    一旦你过去了,我猜 Book 的 Author 是 ManyToManyField,而不是 ForeignKey(因为一本书可以有多个作者,而一个作者可以出版多本书?)在这种情况下,只需 @ 987654325@ 仍然不够。试试Link_Book_Course.objects.filter(book_author__in=myBookObject.author.all())

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 2017-10-15
      • 2017-12-15
      • 1970-01-01
      • 2020-03-14
      • 2019-04-08
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多