de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 9Algorithm
9Algorithm
Question

Gunakan get_queryset() metode atau mengatur queryset variabel?

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.

49 2013-10-31T13:01:38+00:00 5
 9Algorithm
9Algorithm
Pertanyaan edit 31 Oktober 2013 в 1:20
Pemrograman
django
django-views
django-generic-views
Solution / Answer
 Alasdair
Alasdair
31 Oktober 2013 в 1:29
2013-10-31T13:29:39+00:00
Lebih
Sumber
Sunting
#22677926

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())
 Alasdair
Alasdair
Jawaban edit 21 April 2015 в 9:43
67
0
Daniel Roseman
Daniel Roseman
31 Oktober 2013 в 5:41
2013-10-31T17:41:43+00:00
Lebih
Sumber
Sunting
#22677927

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().

9
0
 rj76
rj76
31 Oktober 2013 в 1:28
2013-10-31T13:28:09+00:00
Lebih
Sumber
Sunting
#22677925

Yang queryset atribut ini digunakan secara internal, selalu menggunakan metode (anda akan sering harus melakukan custom query berdasarkan permintaan atau sesi vars misalnya)

4
0
Bar Horing
Bar Horing
21 Oktober 2017 в 2:10
2017-10-21T14:10:46+00:00
Lebih
Sumber
Sunting
#22677928

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.

2
0
Shinto Joseph
Shinto Joseph
27 April 2018 в 6:42
2018-04-27T06:42:33+00:00
Lebih
Sumber
Sunting
#22677929

di dalam kelas hanya mencakup

Class MyViewSet(GenericAPIView):

    queryset = ''

jika anda don't menggunakan queryset di mana saja.

Ini bekerja untuk saya.

Terima kasih

1
0
Related communities 1
Django Indonesia
Django Indonesia
4 680 pengguna
Web Framework For Perfectionists With Deadlines
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
UbiBot UK
Terdaftar 15 jam yang lalu
2
Галина Утяшова
Terdaftar 1 hari yang lalu
3
Asilbek Qadamboyev
Terdaftar 4 hari yang lalu
4
Akshit Mehta
Terdaftar 1 minggu yang lalu
5
me you
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi