django过滤查询集基于另一个查询集的计数

时间:2017-01-24 04:52:53

标签: python django django-models django-queryset

假设我的模特:

model book 
    charfield name

model review
    charfield bookname

有没有办法过滤/排除评论数为零的图书?我仔细查看了stackoverflow,但无法找到答案。这不是一个家庭作业问题。我有一个查询集约。大小约为200,000,我从中得出结论,通过将查询集转换为python列表进行过滤是不明智的,过滤,然后转换回来。有人可以帮我弄这个吗? 感谢

2 个答案:

答案 0 :(得分:2)

因为我强烈建议您更改模型以包含从评论到预订的外键(为了实现此目的的许多其他好处),而不是尝试解决您所询问的确切问题,我会给您提示如何使用外键编写模型,然后如何解决在外键关系的上下文中询问的问题。

以下是我认为你应该写的新模型:

from django.db import models

class Book(models.Model):
    name = models.Charfield()

class Review(models.Model):
    book = models.ForeignKey(Book, related_name='reviews')

然后,要过滤所有可以进行任何评论的图书:

books_with_reviews = Book.objects.filter(reviews__isnull=False).distinct()

或者没有评论的图书:

Book.objects.filter(reviews__isnull=True).distinct()

答案 1 :(得分:1)

首先,您可以查询有评论的图书列表,然后使用django exclude

获得赞美
bookname_has_review = Review.objects.all().distinct().values_list('bookname', flat=True)
book_not_have_review = Book.objects.all().exclude(name__in=bookname_has_review)