2017-01-24 137 views
1

假设我的模型:Django的过滤器查询集基于另一个查询集的计数

model book 
    charfield name 

model review 
    charfield bookname 

有没有办法来过滤/排除与审查书籍数为零?我在stackoverflow上直观地看到了这一点,但无法找到答案。这不是一个家庭作业问题。我有一个查询集约。大小约为200,000,从中我得出结论认为,通过将查询集转换为python列表进行过滤并进行筛选并转换回来并不明智。有人可以帮我弄这个吗? 感谢

+1

是否有一个原因您的评论模型有一个书名的charfield,而不是直接更正的外键t Book对象?如果模型实际链接,过滤器会更容易做到。另外,从您的问题来看,您是否想要保留或排除没有来自查询集的评论的书籍并不明确。 – ChidG

+0

@ChidG感谢您的回复。假设我有大量书籍和评论,我认为每次添加评论时都会将评论与书籍链接起来,因为查找时间太长。应该把它们联系起来,以此来支持这一点吗? – verticese

+0

通过外键链接它们绝对是解决这个问题的标准,最佳实践方式。在两张表之间进行数据库连接的时间比没有连接它们造成的其他问题要少得多。例如,您的数据库需要更大(磁盘空间),因为书名将全部存储在多个位置。当你有多本同名的书时会发生什么?或者当某人在评论中错误地输入书名?我建议你阅读一下关于关系数据库的设计。 – ChidG

回答

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) 
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() 
+0

谢谢,我会改变我的模式。这是一个好主意。 – verticese