Dua potongan-potongan kode yang identik pada blush pertama:
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_poll_list'
queryset = Poll.active.order_by('-pub_date')[:5]
dan
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_poll_list'
def get_queryset(self):
return Poll.active.order_by('-pub_date')[:5]
Apakah ada perbedaan antara mereka? Dan jika itu adalah:
Pendekatan apa yang lebih baik? Atau ketika setting queryset
variabel lebih baik dari override get_queryset
metode? Dan sebaliknya.
Dalam contoh anda, mengesampingkan queryset
dan get_queryset
memiliki efek yang sama. Saya akan sedikit mendukung pengaturan queryset
karena itu's kurang verbose.
Ketika anda mengatur queryset
, yang queryset dibuat hanya sekali, ketika anda mulai server anda. Di sisi lain, get_queryset
metode ini disebut untuk setiap permintaan.
Itu berarti bahwa get_queryset
ini berguna jika anda ingin menyesuaikan permintaan secara dinamis. Misalnya, anda bisa kembali benda-benda yang termasuk pengguna saat ini:
class IndexView(generic.ListView):
def get_queryset(self):
"""Returns Polls that belong to the current user"""
return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]
Contoh lain di mana get_queryset
ini berguna ketika anda ingin untuk menyaring berdasarkan callable, misalnya, kembali hari ini's jajak pendapat:
class IndexView(generic.ListView):
def get_queryset(self):
"""Returns Polls that were created today"""
return Poll.active.filter(pub_date=date.today())
Jika anda mencoba untuk melakukan hal yang sama dengan menetapkan queryset
, kemudian tanggal.hari ini()
hanya akan dipanggil sekali, ketika melihat dimuat, dan tampilan akan menampilkan hasil yang salah setelah beberapa saat.
class IndexView(generic.ListView):
# don't do this!
queryset = Poll.active.filter(pub_date=date.today())
Jawaban yang lain telah terjawab implikasi penting dari fakta bahwa queryset
atribut dievaluasi ketika proses dimulai. Karena anda tidak't hanya menciptakan queryset, anda're sebenarnya mengiris itu, permintaan akan mengevaluasi pada saat itu. Itu berarti bahwa anda hanya akan mendapatkan top 5 jajak pendapat pada saat itu, dan mereka tidak't menyegarkan bahkan jika anda membuat satu sama lain, sampai proses restart.
Ini adalah persis ketika anda harus menggunakan get_queryset()
.
Model dan queryset yang sangat mirip, tetapi queryset's nilai jika disediakan mengabaikan bahwa model's.
Model adalah apa jenis Objek ini menampilkan.
Utama get_queryset mengontrol apa contoh-contoh spesifik tampilan ini menampilkan (ex: the last 5 contoh dibuat)
Dari Django's dokumentasi:
model:
model bahwa pandangan ini akan menampilkan data. Menentukan model = Foo adalah secara efektif yang sama seperti menentukan queryset = Foo.benda-benda.semua(), di mana benda-benda singkatan Foo default manager.
queryset:
QuerySet yang mewakili benda-benda. Jika tersedia, nilai queryset menggantikan nilai yang diberikan untuk model.
get_queryset:
get_queryset() Mengembalikan queryset yang akan digunakan untuk mengambil objek yang akan ditampilkan. Secara default, get_queryset() mengembalikan nilai queryset atribut jika sudah diatur, jika tidak maka konstruk yang QuerySet dengan memanggil semua() metode pada model atribut default manager.