Отличительные значения в ManyToManyField для подмножества объектов в Django - PullRequest
1 голос
/ 11 августа 2011

В моих моделях классы Book и Category определены так:

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 ]

5 голосов
/ 11 августа 2011

Редактировать : Хорошо, у меня не было ManyToManyField для тестирования раньше, поэтому я догадывался. Новый код!

books = Book.objects.filter(title__contains="T")
categories = Category.objects.filter(book__in=books).distinct()
3 голосов
/ 11 августа 2011

Вам необходимо отфильтровать по полю 'book':

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