Джанго, используя метод значений с отношениями m2m / фильтрация таблиц m2m, используя django - PullRequest
0 голосов
/ 08 февраля 2012
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?

Заранее спасибо.

1 Ответ

1 голос
/ 08 февраля 2012

Я думаю, что вы хотите prefetch_related.Примерно так:

authors = Author.objects.prefetch_related('books').all()

Подробнее об этом здесь .

Если вы хотите сделать запрос к своей таблице author_author_books, я думаю, вам нужно указать таблицу "through":

class BookAuthor(models.Model):
  book = models.ForeignKey(Book)
  author = models.ForeignKey(Author)

class Author(models.Model):
  name = models.CharField(max_length=127, blank=False)
  books = models.ManyToMany(Books, through=BookAuthor)

и затем вы можете запросить BookAuthor, как и любая другая модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...