Como faço para usar o ORM do Django para consultar este exemplo de muitos para muitos?

StackOverflow https://stackoverflow.com/questions/533726

  •  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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top