2009-02-10 11 views
5

tengo los siguientes modelos:¿Cómo uso el ORM de Django para consultar este ejemplo de muchos a muchos?

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) 

Con eso se dice, estoy tratando de emular esta consulta mediante el ORM de Django (seleccionar todos los libros escritos por un autor específico, señalando que los autores pueden tener muchos libros y libros se tienen muchos autores):

SELECT book_name 
FROM authorbook, book 
WHERE authorbook.author_id = 1 
AND authorbook.book_id = book.id 

he leído this FAQ page en el sitio web de Django, pero antes de que modificar mi estructura del modelo y quitar AuthorBook, tenía curiosidad si podía emular esa consulta utilizando la estructura actual .

Respuesta

14

Usted debe ser capaz de hacer:

books = Book.objects.filter(authorbook__author_id=1) 

para obtener un QuerySet de los objetos que coincidan con su libro restricción author_id.

Lo bueno de Django es que puedes cocinarlo y jugar con él en el caparazón. También puede encontrar http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships para ser útil.

+0

Argh. Gracias, el cerebro solo funciona a medias hoy. :) – Huuuze

+0

La respuesta de webjunkie parece mejor. Solo estoy aprendiendo a Django. –

+0

En general, no hay ninguna razón para mencionar explícitamente el campo de identificación en el ORM. Suponiendo que tiene una instancia de Author, querría Book.objects.filter (authorbook__author = author). Pero un ManyToManyField es el camino a seguir, por supuesto. –

14

"AutorBook" parece no estar modelado correctamente.

se debe utilizar un ManyToManyField:

class Book(models.Model): 
    name = models.CharField() 
    authors = models.ManyToManyField(Author) 

entonces usted puede hacer:

books = Book.objects.filter(authors__id=1) 
+1

+1 por sugerir ManyToManyField (esa es la forma de Django), -1 por no saber que así es como se hace "debajo del capó". – Javier

+5

Por supuesto, las relaciones m2m usan tablas intermedias. Todavía no está modelado correctamente con Django en este caso. No tiene sentido hacerme ver que sé cómo funciona bajo el capó. – webjunkie

Cuestiones relacionadas