class Book(models.Model):
name = models.CharField(max_length=127, blank=False)
class Author(models.Model):
name = models.CharField(max_length=127, blank=False)
books = models.ManyToMany(Books)
Я пытаюсь отфильтровать авторов, чтобы я мог вернуть набор результатов авторов, например:
[{id: 1, name: 'Grisham', books : [{name: 'The Client'},{name: 'The Street Lawyer}], ..]
До того, как у меня была связь m2m с автором, я мог запросить любое количествоАвтор записывает и получает все нужные мне значения, используя метод values только с одним запросом в БД.
Но похоже, что
Author.objects.all().values('name', 'books')
вернет что-то вроде:
[{id: 1, name: 'Grisham', books :{name: 'The Client'}},{id: 1, name: 'Grisham', books :{name: 'The Street Lawyer'}}]
Глядя на документы, не похоже, что это возможно с помощью метода значений.
https://docs.djangoproject.com/en/dev/ref/models/querysets/
Предупреждение. Поскольку атрибуты ManyToManyField и обратные отношения могут иметь несколько связанных строк, включаяони могут иметь мультипликативный эффект на размер вашего набора результатов.Это будет особенно заметно, если вы включите несколько таких полей в запрос values (), и в этом случае будут возвращены все возможные комбинации.
Я хочу попытаться получить набор результатов размером n сс наименьшим количеством обращений к базе данных authorObject.books.all()
приведет к как минимум n обращений в дБ.
Есть ли способ сделать это в Django?
Я думаю, что одним из способов сделать это с наименьшим количеством обращений к базе данных было бы:
authors = Authors.objects.all().values('id')
q = Q()
for id in authors:
q = q | Q(author__id = id)
#m2m author book table.. from my understanding it is
#not accessible in the django QuerySet
author_author_books.filter(q) #grab all of the book ids and author ids with one query
Есть ли встроенный способ запроса таблицы m2m author_author_books или я собираюсьесть писать sql?Есть ли способ воспользоваться Q () для выполнения логики ИЛИ в raw sql?
Заранее спасибо.