2009-02-10 6 views
5

mam następujące modele:Jak użyć ORM Django do wysłania zapytania do tego przykładu "wiele-do-wielu"?

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) 

Z tym mówi, staram się naśladować tej kwerendy przy użyciu Django ORM (zaznacz wszystko z książek napisanych przez konkretnego autora, zwracając uwagę, że autorzy mogą mieć wiele książek i książek może mieć wielu autorów):

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

Czytałem this FAQ page na stronie internetowej Django, ale zanim zmodyfikować moje struktury modelu i usunąć AuthorBook, byłem ciekaw, czy mogę naśladować tego zapytania przy użyciu obecnej struktury .

Odpowiedz

14

Powinieneś być w stanie to zrobić:

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

aby uzyskać QuerySet książki obiektów pasujących ograniczenie author_id.

Fajną rzeczą w Django jest to, że można to ugotować i bawić się z nim w skorupie. Możesz także znaleźć http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships , aby było przydatne.

+0

Argh. Dzięki - mózg tylko w połowie działa dzisiaj. :) – Huuuze

+0

odpowiedź webjunkie wydaje się być lepsza. Sam się uczyłem z Django. –

+0

Ogólnie nie ma powodu, aby wyraźnie wskazywać pole identyfikatora w ORM. Zakładając, że masz instancję autora, potrzebujesz Book.objects.filter (authorbook__author = author). Ale oczywiście jest też droga ManyToMany. –

14

"AuthorBook" wydaje się nieprawidłowo zamodelowany.

należy użyć ManyToManyField:

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

Następnie można zrobić:

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

+1 za sugerowanie ManyToManyField (to sposób Django), -1 za nieświadomość, że tak to się dzieje "pod maską". – Javier

+5

Oczywiście do relacji m2m używają tabel pośrednich. Nadal nie jest poprawnie modelowany przy użyciu Django w tym przypadku. Nie ma sensu zmuszać mnie do ujawniania, że ​​wiem, jak to działa pod maską. – webjunkie

Powiązane problemy