Lewati ke isi

Agen Setelan Kueri

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.

!!!Perhatikan bahwa, secara default, QuerySet publik telah difilter untuk mengembalikan hanya model yang terkait dengan model induk.

1
Jadi, jika Anda mengeluarkan `post.categories.all()`, Anda akan mendapatkan semua kategori yang terkait dengan posting itu, tidak semuanya dalam tabel.

!!!Perhatikan bahwa saat mengakses metode QuerySet API melalui QuerysetProxy, Anda tidak perlu menggunakan properti objek seperti kueri biasa.

1
2
3
Jadi perhatikan bahwa itu `post.categories.all()` dan **Bukan** `post.categories.objects.all()` Ya.

Untuk mempelajari lebih lanjut tentang metode QuerySet yang tersedia, kunjungi [Pertanyaan][queries]

!!!Peringatan Mempercepat model terkait dari ManyToMany menghapus daftar model terkait yang dimuat pada model induk:

1
2
3
4
5
6
7
8
9
Contoh:`post.categories.first()` akan menetapkan post.kategori ke daftar 1 model terkait - > yang dikembalikan terlebih dahulu ()

Contoh 2: jika postingan memiliki 4 kategori maka `len(post.categories) == 4` memanggil `post.categories.limit(2).all()`
- > hanya akan memuat 2 anak dan sekarang `assert len(post.categories) == 2`

Ini terjadi untuk semua metode QuerysetProxy yang mengembalikan data:`get`,`all` dan `first` dan pada `get_or_create` jika model sudah ada.

Perhatikan bahwa nilai yang dikembalikan oleh `create` atau dibuat dalam `get_or_create` dan `update_or_create`
Jika model tidak ada akan ditambahkan ke daftar relasi (tidak menghapusnya).

Baca data dari database

mendapatkan

Dapatkan (**kwargs): - > model

Untuk mendapatkan hanya satu model relevan yang disaring berdasarkan nama, Anda dapat menggunakan metode get (**kwargs).

1
2
3
4
5
6
7
8
9
# ambil satu kategori
Tegaskan berita = = menunggu post.kategory.get (nama = "Berita")

# perhatikan bahwa metode mengembalikan kategori sehingga Anda dapat mengambil nilai ini
# tetapi juga memodifikasi daftar model terkait di tempat
# jadi terlepas dari apa yang sebelumnya dimuat pada model induk
# sekarang hanya memiliki satu nilai - > hanya dimuat dengan get () call
Assert len (post.category) = = 1
Tegaskan posting. Kategori [0] = = berita

Tip

Memperoleh atau membuat

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

Upaya untuk mendapatkan baris yang memenuhi kriteria, dan jika pengecualian NoMatch dilemparkan, baris baru dibuat dengan kwarg dan\ _ default yang diberikan.

!!!Tip Baca lebih lanjut di dokumen kueri, dapatkan\ _ atau\ _ buat

semuanya

all(**kwargs) -> List[Optional["Model"]]

Untuk mendapatkan daftar model terkait, gunakan metode all ().

Harap dicatat bahwa Anda dapat memfilter set kueri, memilih yang relevan, mengecualikan bidang, dan sebagainya seperti kueri biasa.

1
2
3
4
5
6
7
# dengan semua metode QuerySet - penyaringan, memilih kolom, menghitung dll.
Tunggu news.posts.filter (judul _ _ mengandung = "M2M").semua ()
await Kategori. Objek. Filter (posting _ _ author = Guido).get ()

# kolom model dari banyak hingga banyak hubungan dapat dipilih
news _ post = await news.posts.select _ related ("author").all ()
Tegaskan berita _ posting [0]. penulis = = Guido

Tip

iterasi

iterate(**kwargs) -> AsyncGenerator["Model"]

Untuk mengulangi model terkait, gunakan metode iterasi ().

Harap dicatat bahwa Anda dapat memfilter set kueri, memilih yang relevan, mengecualikan bidang, dan sebagainya seperti kueri biasa.

1
2
3
# iterasi pada kategori posting ini dengan generator async
Sinkronisasi untuk kategori dalam post.kategorories.iterate ():
    Cetak (category.name)

Tip

Masukkan / perbarui data ke dalam database

membuat

Buat (**kwargs): - > Model

Buat model terkait langsung dari model induk.

Tabel tertaut dan ID relasional dalam database diisi secara otomatis.

1
2
3
4
# Membuat kolom objek dari contoh:
Menunggu post.kategory.create (nama = "Tips")
Tegaskan len (menunggu post.kategorories.all ()) = = 2
# contoh yang baru dibuat sudah memiliki hubungan yang bertahan dalam database

Tip

Untuk banyak-ke-banyak hubungan, jika Anda menyatakan bidang tambahan pada model pass-through yang disediakan secara eksplisit, ada kemampuan tambahan untuk melewati parameter yang akan digunakan untuk membuat model pass-through.

Diberikan sampel seperti itu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

Anda dapat mengisi bidang dengan model dalam panggilan buat () dengan cara berikut:

1
2
3
4
5
6
7
Post = await Post (judul = "Test post").save ()
Menunggu post.kategory.buat (
    Nama = "Kategori tes 1,"
    # dalam argumen melewati kamus dengan nama bidang dan kunci tembus
    # sesuai dengan melalui bidang model
    Postkategori ={"sort_order": 1, "param_name": "volume"},
)

Memperoleh atau membuat

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

Upaya untuk mendapatkan baris yang memenuhi kriteria, dan jika pengecualian NoMatch dilemparkan, baris baru dibuat menggunakan kwarg yang diberikan.

!!!Tip Baca lebih lanjut di dokumen kueri, dapatkan\ _ atau\ _ buat

Perbarui atau buat

update_or_create(**kwargs) -> Model

Perbarui model, atau buat model baru jika tidak ada kecocokan dalam database.

!!!Tip Baca Selengkapnya di pembaruan Dokumentasi Kueri\ _ atau\ _ buat

pembaruan

update(**kwargs, each:bool = False) -> int

Perbarui model yang relevan dengan parameter kata kunci yang disediakan, kembalikan jumlah baris yang diperbarui.

Tip

Harap dicatat bahwa parameter dengan nama bidang dan kamus bidang juga dapat diterima untuk pembaruan relasional banyak-ke-banyak.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

Pada contoh di atas, Anda dapat memperbarui properti postkategori dalam panggilan berikut:

1
2
3
Menunggu post.kategorories.filter (nama = "Uji kategory3").update (
            PostKategori ={"sort_order": 4}
        )

Penyaringan dan penyortiran

penyaring

filter(*args, **kwargs) -> QuerySet

Memungkinkan Anda memfilter berdasarkan atribut / bidang model apa pun dan mendapatkan instance menggunakan filter di seluruh hubungan FK.

Tip

mengecualikan

exclude(*args, **kwargs) -> QuerySet

Ini bekerja persis sama dengan filter, dan semua pengubah (akhiran) sama, tetapi kondisi tidak dikembalikan.

Tip

Dasar pemesanan

order_by(columns:Union[List, str]) -> QuerySet

Menggunakan order\ _ by (), Anda dapat mengurutkan hasil di database dengan bidang yang Anda pilih.

!!!Tip Baca lebih lanjut dalam urutan dokumen kueri\ _ by

Bergabung dan mengajukan

Pilih yang relevan

select_related(related: Union[List, str]) -> QuerySet

Memungkinkan model terkait untuk dipilih selama kueri yang sama.

Saat menggunakan\ _ lated terpilih, selalu hanya satu kueri yang di jalankan terhadap database, yang berarti sambungan (terkadang kompleks) dihasilkan dan model bersarang selanjutnya diproses dalam Python.

!!!Tip Baca lebih lanjut tentang pilih\ _ lated dalam dokumen kueri

korelasi prefetch

prefetch_related(related: Union[List, str]) -> QuerySet

Hal ini diperbolehkan untuk prefetch model terkait selama kueri - tetapi sebagai lawan dari\ _ lated terpilih, setiap model berikutnya diambil dalam kueri database terpisah.

Dengan prefetch\ _ lated, setiap model menjalankan satu pertanyaan terhadap database, yang berarti Anda akan mengeksekusi beberapa pertanyaan satu demi satu.

!!!Tip Baca lebih lanjut di dokumen kueri prefetch\ _ lated

Halaman dan baris

paging

paginate(page: int, page_size: int = 20) -> QuerySet

Menggabungkan metode offset dan limit berdasarkan nomor halaman dan ukuran.

Tip

pembatasan

limit(limit_count: int) -> QuerySet

Anda dapat membatasi hasil pada jumlah model induk yang diperlukan.

Tip

offset

offset(offset: int) -> QuerySet

Anda dapat mengimbangi hasilnya dengan jumlah model master yang diperlukan.

Tip

Pilih subset kolom

lapangan

fields(columns: Union[List, str, set, dict]) -> QuerySet

Dengan bidang (), Anda dapat memilih subset kolom model untuk membatasi beban data.

Tip

bidang eksklusi

exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet

Dengan kecuali\ _ field (), Anda dapat memilih subset kolom model untuk dikecualikan untuk membatasi pemuatan data.

!!!Tip Pelajari lebih lanjut dalam dokumentasi kueri kecuali\ _ bidang

fungsi agregat

menghitung

count(distinct: bool = True) -> int

Mengembalikan jumlah baris yang sesuai dengan kriteria yang diberikan (yaitu menerapkan filter dan pengecualian).

Tip

ada

Keberadaan () - > Boolean

Mengembalikan nilai Boolean untuk mengkonfirmasi apakah ada baris yang memenuhi kriteria yang diberikan (diterapkan dengan filter dan pengecualian).

Tip