Menggabungkan Berbilang Set Pertanyaan dalam Django: Penyelesaian Komprehensif
Apabila mencari merentasi berbilang model dalam tapak Django, mungkin perlu menggabungkannya QuerySets masing-masing untuk mendayakan penomboran dalam hasil carian. Ini boleh menimbulkan cabaran kerana QuerySets tidak mempunyai fungsi cantum terbina dalam.
Penggabungan Senarai Manual
Satu pendekatan melibatkan penggabungan QuerySets secara manual ke dalam senarai menggunakan gelung:
result_list = [] page_list = Page.objects.filter( # Filter logic for Page model ) article_list = Article.objects.filter( # Filter logic for Article model ) post_list = Post.objects.filter( # Filter logic for Post model ) for x in page_list: result_list.append(x) for x in article_list: result_list.append(x) for x in post_list: result_list.append(x)
Kaedah ini, walau bagaimanapun, tidak cekap dan boleh membawa kepada masalah ingatan apabila berurusan dengan set data yang besar.
Menggunakan itertools.chain
Pendekatan yang lebih cekap dan mesra memori ialah menggunakan fungsi itertools.chain daripada perpustakaan standard Python:
from itertools import chain result_list = list(chain(page_list, article_list, post_list))
itertools.chain mencipta penjana yang mengulangi elemen setiap QuerySet dalam urutan, menggunakan kurang memori daripada menukarnya kepada senarai dahulu.
Mengisih Set Pertanyaan Gabungan
Mengisih Set Pertanyaan gabungan adalah mudah menggunakan sorted(...) dan attrgetter:
from operator import attrgetter result_list = sorted( chain(page_list, article_list, post_list), key=attrgetter('date_created') )
attrgetter mendapatkan semula atribut yang ditentukan daripada setiap objek dalam QuerySet, membenarkan pengisihan berdasarkan medan tertentu (cth., date_created).
Selain itu, susunan isihan boleh diterbalikkan dengan menetapkan parameter terbalik kepada Benar:
result_list = sorted( chain(page_list, article_list, post_list), key=attrgetter('date_created'), reverse=True, )
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan dan Mengisih Berbilang Set Pertanyaan Django dengan Cekap untuk Penomboran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!