ManyToManyField中的值与Django中的对象子集不同

时间:2011-08-11 13:08:17

标签: sql django django-queryset

在我的模型中,我将类BookCategory定义为:

class Category(models.Model):
    name = models.CharField()

class Book(models.Model):
    title = models.CharField()
    categories = models.ManyToManyField(Category)

我想要的是在Category个实例的给定查询集的categories字段中引用的Book个实例集。

我意识到我可以遍历书籍的查询集并收集每本书的类别,但这对我来说似乎效率低下,因为这可以在单个SQL查询中说明:

SELECT DISTINCT name
FROM myapp_book_categorys JOIN myapp_category ON myapp_book_categorys.category_id=myapp_category.id
WHERE myapp_book_categorys.book_id IN 
    (SELECT id FROM myapp_book WHERE ...);

原始SQL是正确的方法,还是有更高级别的解决方案效率相当?

2 个答案:

答案 0 :(得分:5)

编辑:好的,之前我没有ManyToManyField进行测试,所以我在猜测。新代码!

books = Book.objects.filter(title__contains="T")
categories = Category.objects.filter(book__in=books).distinct()

答案 1 :(得分:3)

您需要按“图书”字段进行过滤:

book_ids = list(Book.objects.filter(...).values_list('id', flat=True)
categories_queryset = Category.objects.filter(book__in=book_ids).distinct()
相关问题