Django:1.10
Wenn Sie eine Abfrage mit Django generieren, wird eine große Anzahl von Abfragen ausgegeben, wenn Sie diese nicht sorgfältig schreiben.
Schreiben Sie zunächst die Protokolleinstellungen in manage.py, um die Abfrage an die Serverkonsole auszugeben.
manage.py
LOGGING = {
'version': 1,
'formatters': {
'all': {
'format': '%(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'all',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
Lassen Sie uns eine Abfrage ausführen, um die Liste der Bücher zu erhalten, die vom ausgewählten Autor veröffentlicht wurden, der zuletzt verwendet wurde.
So generieren Sie eine Abfrage mit dem IN-Operator in Django http://qiita.com/nakkun/items/86a94e65fe6785325f54
Quelle
books = Book.objects.filter(author_id__in = form.cleaned_data['author'])
Ausführungsergebnis
(0.002) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" IN (1, 3); args=(1, 3)
Die SQL lief wie erwartet. Ich habe die gleiche Abfrage mit "author_ \ _ id_ \ in" wie unten gezeigt. (Die Anzahl von "" ist unterschiedlich)
Quelle
books = Book.objects.filter(author__id__in = form.cleaned_data['author'])
Im Fall von "author_ \ _ id_ \ _in" habe ich mich gefragt, ob sie beitreten würden, aber das war nicht der Fall.
Bisher gibt es kein besonderes Problem. Wenn Sie jedoch versuchen, den Autorennamen danach anzuzeigen, lautet das Ausführungsergebnis wie folgt.
Quelle
books = Book.objects.filter(author_id__in = form.cleaned_data['author'])
[print(book.author.name) for book in books]
Ausführungsergebnis
(0.003) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" IN (1, 3); args=(1, 3)
(0.001) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" = 1; args=(1,)
Hirotsugu Mori
(0.000) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" = 3; args=(3,)
Miyagiya Masamitsu
(0.000) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" = 3; args=(3,)
Miyagiya Masamitsu
(0.001) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" = 3; args=(3,)
Miyagiya Masamitsu
(0.000) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" = 3; args=(3,)
Miyagiya Masamitsu
Ich habe eine ziemlich nutzlose Anfrage gestellt.
Sie müssen also eine Quelle schreiben, die eine verknüpfte Abfrage wie folgt ausgibt:
Quelle
books = Book.objects.select_related().filter(author_id__in = form.cleaned_data['author'])
[print(book.author.name) for book in books]
Ausführungsergebnis
(0.004) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id", "books_author"."id", "books_author"."name" FROM "books_book" INNER JOIN "books_author" ON ("books_book"."author_id" = "books_author"."id") WHERE "books_book"."author_id" IN (1, 3); args=(1, 3)
Hirotsugu Mori
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Jetzt müssen Sie die SQL nur noch einmal ausgeben.
Es ist möglicherweise besser, während der Überprüfung des SQL zu entwickeln, bevor Sie sich daran gewöhnen, damit Sie keine große Menge an SQL werfen, ohne es zu wissen.
Über 3 andere Methoden.
① Verwendung von prefetch_related
Quelle
books = Book.objects.filter(author_id__in = form.cleaned_data['author']).prefetch_related('author')
[print(book.author.name) for book in books]
Ausführungsergebnis
(0.001) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" IN (1, 3); args=(1, 3)
(0.001) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" IN (1, 3); args=(1, 3)
Hirotsugu Mori
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
② Ausgehend vom Autorenmodell
Quelle
authors = Author.objects.filter(id__in = form.cleaned_data['author'])
[[print(book.atuhor.name) for book in author.book_set.all()] for author in authors]
Ausführungsergebnis
(0.002) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" IN (1, 3); args=(1, 3)
(0.001) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" = 1; args=(1,)
Hirotsugu Mori
(0.000) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" = 3; args=(3,)
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
③ Verwenden Sie prefetch_related ab dem Autorenmodell
Quelle
authors = Author.objects.filter(id__in = form.cleaned_data['author']).prefetch_related("book_set")
[[print(book.atuhor.name) for book in author.book_set.all()] for author in authors]
Ausführungsergebnis
(0.002) SELECT "books_author"."id", "books_author"."name" FROM "books_author" WHERE "books_author"."id" IN (1, 3); args=(1, 3)
(0.002) SELECT "books_book"."id", "books_book"."name", "books_book"."author_id" FROM "books_book" WHERE "books_book"."author_id" IN (1, 3); args=(1, 3)
Hirotsugu Mori
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Miyagiya Masamitsu
Recommended Posts