Como faço para usar o ORM do Django para consultar este exemplo de muitos para muitos?
-
22-08-2019 - |
Pergunta
Eu tenho os seguintes modelos:
class Author(models.Model):
author_name = models.CharField()
class Book(models.Model):
book_name = models.CharField()
class AuthorBook(models.Model):
author_id = models.ForeignKeyField(Author)
book_id = models.ForeignKeyField(Book)
Com isso dito, eu estou tentando imitar essa consulta usando o Django ORM (selecionar todos os livros escritos por um autor específico, observando que os autores podem ter muitos livros e livros pode ter muitos autores):
SELECT book_name
FROM authorbook, book
WHERE authorbook.author_id = 1
AND authorbook.book_id = book.id
Eu li este FAQ página no site do Django, mas antes que eu modificar o meu modelo de estrutura e remover AuthorBook, eu estava curioso para saber se eu poderia imitar essa consulta usando a estrutura atual.
Solução
Você deve ser capaz de fazer:
books = Book.objects.filter(authorbook__author_id=1)
para obter um QuerySet do livro objetos que coincidem com sua restrição author_id.
A coisa agradável sobre Django é que você pode cozinhar isso e brincar com ele no shell. Você também pode encontrar http://docs.djangoproject.com/ en / dev / temas / db / consultas / # Spanning-multi-valorizados-relações para ser útil.
Outras dicas
"AuthorBook" parece não corretamente modelado.
Você deve usar um ManyToManyField
:
class Book(models.Model):
name = models.CharField()
authors = models.ManyToManyField(Author)
Em seguida, você pode fazer:
books = Book.objects.filter(authors__id=1)