Lewati ke isi

Kembali ke sumber data asli

Metode berikut memungkinkan Anda untuk mengeksekusi kueri, tetapi alih-alih mengembalikan model ormar, kembalikan kamus atau daftar tupel.

  • values(fields = None, exclude_through = False) -> List[Dict]

  • values_list(fields = None, exclude_through = False, flatten = False) -> List

  • Agen Setelan Kueri

    • QuerysetProxy.values(fields = None, exclude_through = False) metode
    • QuerysetProxy.values_list(fields = None, exclude_through= False, flatten = False) metode

Bahaya!!!Perhatikan bahwa nilai dan nilai\ _ daftar melewatkan penguraian hasil ke model ormar, dan karena itu lewati validasi hasil!

Peringatan!!!, perhatikan bahwa setiap entri dalam daftar hasil adalah cerminan satu-ke-satu dari baris hasil kueri. Karena baris tidak diurai jika Anda memiliki hubungan satu-ke-banyak atau banyak-ke-banyak, nilai kolom duplikat muncul di entri hasil jika baris induk memiliki beberapa baris terkait.

nilai

values(fields: Union[List, str, Set, Dict] = None, exclude_through: bool = False) -> List[Dict]

Mengembalikan daftar kamus nilai yang mewakili kolom dari database.

Anda dapat menggunakan parameter bidang untuk memilih subset bidang yang menerima rangkaian parameter yang sama dengan metode bidang ().

Harap dicatat bahwa melewati bidang ke nilai (bidang) sebenarnya adalah jalan pintas ke bidang panggilan (bidang).nilai ().

!!!Untuk mempelajari lebih lanjut tentang apa yang dapat Anda teruskan ke bidang dan cara memilih bidang model bersarang, baca dokumentasi Kolom Pilih

Anda dapat membatasi jumlah baris dengan menyediakan kondisi dalam filter () dan kecuali (), tetapi perlu diketahui bahwa meskipun hanya satu baris (atau tidak ada baris!) yang memenuhi kriteria Anda, Anda akan mengembalikan daftar sebagai tanggapan.

Contoh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# dinyatakan model

Kategori Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config (tablename = "kategori")

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 40)
    sort _ order: int = ormar. Integer (nullable = Benar)


Pos Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 200)
    Kategori: Opsional [Kategori] = ormar. ForeignKey (Kategori)

# sampel data
Berita = await Kategori (nama = "Berita," urut _ order = 0).simpan ()
Menunggu Postingan (nama = "Ormar menyerang lagi!," kategori = berita).simpan ()
Menunggu Postingan (nama = "Kenapa belum pakai ormar?," kategori = berita).simpan ()
Menunggu Postingan (nama = "Lihat ini, ormar sekarang gratis," kategori = berita).simpan ()

Akses model pos:

1
2
3
4
5
6
Postingan = menunggu Post.objeks.value ()
Posting yang ditetapkan = = [
    {"id": 1, "name": "Ormar strikes again!", "category": 1},
    {"id": 2, "name": "Why don't you use ormar yet?", "category": 1},
    {"id": 3, "name": "Check this out, ormar now for free", "category": 1},
]

Untuk memilih model terkait secara bersamaan, gunakan pilih\ _ lated atau prefetch\ _ lated.

Perhatikan bagaimana kolom model bersarang di awali dengan jalur relasional penuh dari model otonom (model yang digunakan dalam kueri).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nyatakan model

Pengguna Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)


Peran Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    Pengguna: Daftar [Pengguna] = ormar. Banyak (Pengguna)

# sampel data
Pencipta = menunggu Pengguna (nama = "Anonim").simpan ()
Admin = waiting Role (nama = "admin").save ()
Editor = menunggu Peran (nama = "editor").simpan ()
Tunggu kreator.karakters.add (admin)
Tunggu kreator.karakters.add (editor)

Pilih pengguna dengan peran

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Pengguna = menunggu Pengguna. Objek. Pilih _ terkait ("peran").nilai ()
# catatan awalan bersarang: rolusers dan peran
Tegaskan pengguna = = [
    {
        "Id": 1,
        "Nama": "Anonim,"
        "roleuser _ _ id": 1,
        "peran roleuser _ _": 1,
        "roleuser _ _ user": 1,
        "peran _ _ id": 1,
        "peran _ _ nama": "admin,"
    },
    {
        "Id": 1,
        "Nama": "Anonim,"
        "roleuser _ _ id": 2,
        "peran _ _ roleuser": 2,
        "roleuser _ _ user": 1,
        "peran _ _ id": 2,
        "peran _ _ nama": "editor,"
    },
]

!!!Perhatikan bahwa hubungan antara peran dan pengguna banyak-ke-banyak, sehingga Anda juga bisa mendapatkan kolom model secara default.

Gabungkan bidang dan bidang yang relevan untuk memilih hanya 3 bidang.

Harap dicatat bahwa kami juga mengecualikan definisi dengan model, karena menurut definisi, setiap model yang terkandung dalam gabungan tetapi tanpa referensi di bidang diasumsikan dipilih sepenuhnya (termasuk semua bidang).

!!!Perhatikan bahwa sebagai lawan dari pendekatan queryset lain di sini, Anda dapat mengecualikan model perantara tetapi menjaga kolom trailing, yang tidak masuk akal saat mengurai sumber data asli ke dalam model.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
Jadi dalam kategori hubungan - > kategori _ x _ post - > post - > pengguna Anda dapat mengecualikan
kategori _ x _ posting dan posting model tetapi dapat mempertahankan pengguna satu.
Konteks yang tidak memungkinkan seolah-olah Anda akan mengecualikan melalui dan memposting model
Tidak akan ada cara untuk menjangkau model pengguna dari model kategori).


Pengguna = (
        Tunggu Role.objeks.pilih _ terkait ("pengguna _ _ kategori")
        . filter (nama = "admin")
        . Bidang ({"nama":..., "pengguna": {"nama":..., "kategori":{"name"}}})
        mengecualikan _ field ("Pengguna Peran")
        . Nilai ()
    )
Tegaskan pengguna = = [
    {
        "Nama": "admin,"
        "pengguna _ _ name": "Anonim,"
        "pengguna _ _ kategori _ _ nama": "Berita,"
    }
]

Jika ada beberapa ManyToBanyak model dalam kueri, Anda harus mengecualikan setiap model secara manual.

Untuk menghindari beban ini, ormar memberi Anda parameter kecuali\ _ through = False. Jika bendera ini disetel ke True, semua model sepenuhnya dikecualikan.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# setara dengan pertanyaan di atas, perhatikan kurangnya pengecualian _ field call
Pengguna = (
    Tunggu Role.objeks.pilih _ terkait ("pengguna _ _ kategori")
    . filter (nama = "admin")
    . Bidang ({"nama":..., "pengguna": {"nama":..., "kategori":{"name"}}})
    . Nilai (tidak termasuk _ melalui = Benar)
)
Tegaskan pengguna = = [
    {
        "Nama": "admin,"
        "pengguna _ _ name": "Anonim,"
        "pengguna _ _ kategori _ _ nama": "Berita,"
    }
]

daftar nilai

values_list(fields: Union[List, str, Set, Dict] = None, flatten: bool = False, exclude_through: bool = False) -> List

Mengembalikan daftar tuples yang mewakili nilai kolom dari database.

Anda dapat menggunakan parameter bidang untuk memilih subset bidang yang menerima rangkaian parameter yang sama dengan metode bidang ().

Perhatikan bahwa melewati bidang ke nilai\ _ daftar (bidang) sebenarnya adalah jalan pintas ke bidang panggilan (bidang).value\ _ list ().

!!!Untuk mempelajari lebih lanjut tentang apa yang dapat Anda teruskan ke bidang dan cara memilih bidang model bersarang, baca dokumentasi Kolom Pilih

Jika Anda hanya memilih satu kolom / bidang, Anda dapat lulus pipih = Benar, yang akan mengembalikan daftar nilai alih-alih daftar elemen tupel.

!!!memperingatkan bahwa pengaturan rata = Benar akan membuang QueryDefinitionError pengecualian jika beberapa (atau tidak ada, yang berarti semua) bidang yang dipilih.

Anda dapat membatasi jumlah baris dengan menyediakan kondisi dalam filter () dan kecuali (), tetapi perlu diketahui bahwa meskipun hanya satu baris (atau tidak ada baris!) yang memenuhi kriteria Anda, Anda akan mengembalikan daftar sebagai tanggapan.

Contoh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# dinyatakan model

Kategori Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config (tablename = "kategori")

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 40)
    sort _ order: int = ormar. Integer (nullable = Benar)


Pos Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 200)
    Kategori: Opsional [Kategori] = ormar. ForeignKey (Kategori)

# sampel data
Berita = await Kategori (nama = "Berita," urut _ order = 0).simpan ()
Menunggu Postingan (nama = "Ormar menyerang lagi!," kategori = berita).simpan ()
Menunggu Postingan (nama = "Kenapa belum pakai ormar?," kategori = berita).simpan ()
Menunggu Postingan (nama = "Lihat ini, ormar sekarang gratis," kategori = berita).simpan ()

Akses model pos:

1
2
3
4
5
6
7
Postingan = await Post.objeks.value _ list ()
# perhatikan bagaimana kolom mengacu pada id, nama dan kategori (fk)
Posting yang ditetapkan = = [
    (1, "Ormar menyerang lagi!," 1),
    (2, "Kenapa kamu belum menggunakan ormar?," 1),
    (3, "Lihat ini, ormar sekarang gratis," 1),
]

Untuk memilih model terkait secara bersamaan, gunakan pilih\ _ lated atau prefetch\ _ lated.

Mari kita memperumit hubungan dan memodifikasi model kategori yang disebutkan sebelumnya untuk merujuk model pengguna.

1
2
3
4
5
6
7
8
Kategori Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config (tablename = "kategori")

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 40)
    sort _ order: int = ormar. Integer (nullable = Benar)
    # kolom baru di bawah ini
    dibuat _ oleh: Opsional [Pengguna] = ormar. ForeignKey (Pengguna, terkait _ name = "kategori")

Sekarang buat data sampel dengan tautan pengguna.

1
2
3
4
5
6
Pencipta = menunggu Pengguna (nama = "Anonim").simpan ()
Admin = waiting Role (nama = "admin").save ()
Editor = menunggu Peran (nama = "editor").simpan ()
Tunggu kreator.karakters.add (admin)
Tunggu kreator.karakters.add (editor)
Berita = menunggu Kategori (nama = "Berita," urut _ order = 0, dibuat _ oleh = pencipta).simpan ()

Gabungkan bidang dan bidang yang relevan untuk memilih hanya 3 bidang.

Harap dicatat bahwa kami juga mengecualikan definisi dengan model, karena menurut definisi, setiap model yang terkandung dalam gabungan tetapi tanpa referensi di bidang diasumsikan dipilih sepenuhnya (termasuk semua bidang).

!!!Perhatikan bahwa sebagai lawan dari pendekatan queryset lain di sini, Anda dapat mengecualikan model perantara tetapi menjaga kolom trailing, yang tidak masuk akal saat mengurai sumber data asli ke dalam model.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Jadi dalam kategori hubungan - > kategori _ x _ post - > post - > pengguna Anda dapat mengecualikan
kategori _ x _ posting dan posting model tetapi dapat mempertahankan pengguna satu.
Konteks yang tidak memungkinkan seolah-olah Anda akan mengecualikan melalui dan memposting model
Tidak akan ada cara untuk menjangkau model pengguna dari model kategori).


Pengguna = (
        Tunggu Role.objeks.pilih _ terkait ("pengguna _ _ kategori")
        . filter (nama = "admin")
        . Bidang ({"nama":..., "pengguna": {"nama":..., "kategori":{"name"}}})
        mengecualikan _ field ("Pengguna Peran")
        . nilai _ daftar ()
    )
Tegaskan pengguna = = [ ("admin," "Anonim," "Berita") ]

Jika ada beberapa ManyToBanyak model dalam kueri, Anda harus mengecualikan setiap model secara manual.

Untuk menghindari beban ini, ormar memberi Anda parameter kecuali\ _ through = False. Jika bendera ini disetel ke True, semua model sepenuhnya dikecualikan.

1
2
3
4
5
6
7
8
# setara dengan pertanyaan di atas, perhatikan kurangnya pengecualian _ field call
Pengguna = (
        Tunggu Role.objeks.pilih _ terkait ("pengguna _ _ kategori")
        . filter (nama = "admin")
        . Bidang ({"nama":..., "pengguna": {"nama":..., "kategori":{"name"}})
        nilai _ daftar (tidak termasuk _ melalui = Benar)
    )
Tegaskan pengguna = = [ ("admin," "Anonim," "Berita") ]

Gunakan ratakan untuk mendapatkan daftar nilai.

1
2
3
4
5
6
# menggunakan perataan dengan lebih dari satu bidang akan meningkatkan pengecualian!
Menunggu Role.objeks.fields ({"name", "id"}).value _ list (rata = Benar)

# penggunaan yang tepat
Peran = menunggu Role.objekfield ("nama"). nilai _ daftar (rata = Benar)
Menegaskan peran = = ["admin," "editor"]

Metode QuerysetProxy

Saat mengakses bidang ManyToMany dan ReverseForeignKey yang relevan secara langsung, daftar model terkait dikembalikan.

Tetapi juga memaparkan subset dari QuerySet API, sehingga Anda dapat memfilter, membuat, memilih model terkait, dll. langsung dari model induk.

Peringatan!!!Karena menggunakan nilai dan nilai\ _ list model skips parsing dan validasi, kedua metode ini tidak menghapus model terkait yang dimuat saat ini dan tidak menimpa model yang saat ini dimuat dengan hasil panggilan mereka sendiri dibandingkan dengan semua metode baca lainnya di querysetproxy!

nilai

Sama seperti fungsi nilai di atas, tetapi memungkinkan Anda untuk mengambil objek terkait dari ujung hubungan yang lain.

!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy

daftar nilai

Sama persis dengan fungsi nilai\ _ daftar di atas, tetapi memungkinkan Anda untuk menanyakan atau membuat objek terkait dari ujung hubungan yang lain.

!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy