Pilih subset kolom
Untuk memilih hanya kolom yang dipilih dalam model, Anda dapat menggunakan fungsi berikut.
-
fields(columns: Union[List, str, set, dict]) -> QuerySet
-
exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet
-
Agen Setelan Kueri
QuerysetProxy.fields(columns: Union[List, str, set, dict]) metode
QuerysetProxy.exclude_fields(columns: Union[List, str, set, dict]) metode
lapangan
fields(columns: Union[List, str, set, dict]) -> QuerySet
Dengan bidang (), Anda dapat memilih subset kolom model untuk membatasi beban data.
Perhatikan bahwa bidang () dan kecuali\ _ bidang () berlaku untuk model induk (pada pertanyaan normal seperti dapatkan, semua, dll.) dan model\ _ lated dan prefetch\ _ lated terpilih (menggunakan notasi bersarang).
Data contoh berikut diberikan:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 | import asyncio
import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from tests.settings import DATABASE_URL
base_ormar_config = ormar.OrmarConfig(
database=databases.Database(DATABASE_URL, force_rollback=True),
metadata=sqlalchemy.MetaData(),
)
class Company(ormar.Model):
ormar_config = base_ormar_config.copy(tablename="companies")
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
founded: int = ormar.Integer(nullable=True)
class Car(ormar.Model):
ormar_config = base_ormar_config.copy()
id: int = ormar.Integer(primary_key=True)
manufacturer = ormar.ForeignKey(Company)
name: str = ormar.String(max_length=100)
year: int = ormar.Integer(nullable=True)
gearbox_type: str = ormar.String(max_length=20, nullable=True)
gears: int = ormar.Integer(nullable=True)
aircon_type: str = ormar.String(max_length=20, nullable=True)
@create_drop_database(base_config=base_ormar_config)
async def sample_data():
# build some sample data
toyota = await Company.objects.create(name="Toyota", founded=1937)
await Car.objects.create(
manufacturer=toyota,
name="Corolla",
year=2020,
gearbox_type="Manual",
gears=5,
aircon_type="Manual",
)
await Car.objects.create(
manufacturer=toyota,
name="Yaris",
year=2019,
gearbox_type="Manual",
gears=5,
aircon_type="Manual",
)
await Car.objects.create(
manufacturer=toyota,
name="Supreme",
year=2020,
gearbox_type="Auto",
gears=6,
aircon_type="Auto",
)
asyncio.run(sample_data())
|
Anda dapat memilih bidang yang ditentukan dengan melewati str, List[str], Set[str] or dict dengan definisi bersarang.
Untuk memasukkan model terkait, gunakan simbol {related_name}__{column}[__{optional_next} etc.].
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | semua _ mobil = menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Ladang (['id', 'name', 'pabrikan _ _ name'])
. Semua ()
)
Untuk mobil di semua _ mobil:
# kolom yang dikecualikan akan menghasilkan Tidak ada
Tegaskan semua (getattr (mobil, x) adalah Tidak ada untuk x dalam ['tahun', 'gearbox _ type', 'gear', 'aircon _ type'])
# kolom termasuk pada model terkait akan tersedia, kolom pk selalu disertakan
# bahkan jika Anda tidak memasukkannya ke dalam daftar bidang
Tegaskan car.manufacturer.name = = 'Toyota'
# juga dalam model terkait bersarang - Anda tidak dapat mengecualikan pk - selalu ditambahkan secara otomatis
Mobil pencuci mulut didirikan Tidak ada
|
Bidang () dapat disebut beberapa kali untuk membangun kolom yang akan dipilih.
Jika Anda menyertakan model terkait dalam panggilan\ _ lated () yang dipilih, tetapi Anda tidak menentukan kolom untuk model tersebut di lapangan
-
Berarti daftar semua bidang model bersarang ini.
semua _ mobil = menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ('id')
. Bidang (['nama'])
. Semua ()
)
semua bidang dari model perusahaan dipilih
Tegaskan semua _ mobil [0]. manufacturer.name = = 'Toyota'
Tegaskan semua _ mobil [0] .manuer.founding = = 1937
!!! Peringatan tidak dapat mengecualikan bidang wajib karena menimbulkan ValidationError dan bidang harus kosong untuk dikecualikan.
| Metode `values()` dapat digunakan untuk mengecualikan bidang wajib, meskipun data akan
Dikembalikan sebagai `dict`.
|
Anda tidak dapat mengecualikan kolom nomor model wajib - nama pabrikan__dalam contoh ini.
| Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Ladang (['id', 'name', 'pabrikan _ _ didirikan'])
. Semua ()
)
# akan meningkatkan ValidationError sebagai company.name diperlukan
|
!!!Kolom Tip Pk tidak dapat dikecualikan - selalu ditambahkan secara otomatis, meskipun tidak disertakan secara eksplisit.
Anda juga dapat melewati bidang untuk dimasukkan sebagai kamus atau set.
Untuk menandai bidang inklusi dalam kamus, gunakan namanya sebagai kunci dan elipsis sebagai nilainya.
Untuk melintasi model bersarang, gunakan kamus bersarang.
Untuk memasukkan bidang tingkat terakhir alih-alih kamus bersarang, Anda dapat menggunakan koleksi.
Untuk memasukkan seluruh model bersarang, tentukan nama bidang dan elips yang terkait dengan model.
Anda dapat melihat contoh setara di bawah ini:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 | # 1. seperti pada contoh di atas
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Ladang (['id', 'name', 'pabrikan _ _ name'])
. Semua ()
)
# 2. untuk menandai bidang sesuai kebutuhan menggunakan elipsis
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ({'id':...,
'Nama':...,
'Produsen': {
'Nama':...
}
})
. Semua ()
)
# 3. untuk memasukkan model bersarang utuh menggunakan elipsis
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ({'id':...,
'Nama':...,
'Produsen':...
})
. Semua ()
)
# 4. untuk menentukan bidang pada tingkat bersarang terakhir
# Anda juga dapat menggunakan set - setara dengan 2 di atas
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ({'id':...,
'Nama':...,
'Pabrikan': {'name'}
})
. Semua ()
)
# 5. tentu saja set dapat memiliki banyak bidang
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ({'id':...,
'Nama':...,
'Pabrikan': {'name', 'founded'}
})
. Semua ()
)
# 6. Anda dapat mencakup semua ladang bersarang,
# tapi itu akan setara dengan 3. di atas yang lebih pendek
Menunggu (
Mobil. Objek
. pilih _ terkait ('pabrikan')
. Bidang ({'id':...,
'Nama':...,
'Pabrikan': {'id', 'name', 'founded'}
})
. Semua ()
)
|
Perhatikan
Jadi operasi seperti filter(),select_related(),limit() dan offset() dll bisa dirantai.
Sesuatu seperti Track.objects.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()
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.
Ini adalah kebalikan dari metode bidang (), jadi periksa dokumentasi di atas untuk melihat opsi yang tersedia.
Secara khusus, periksa bagaimana kamus dan koleksi bersarang dilewatkan sebagai topeng untuk mengecualikan bidang dari seluruh hierarki.
Perhatikan bahwa bidang () dan kecuali\ _ bidang () berlaku untuk model induk (pada pertanyaan normal seperti dapatkan, semua, dll.) dan model\ _ lated dan prefetch\ _ lated terpilih (menggunakan notasi bersarang).
Anda dapat menemukan beberapa contoh sederhana di bawah ini:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 | import asyncio
import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from tests.settings import DATABASE_URL
base_ormar_config = ormar.OrmarConfig(
database=databases.Database(DATABASE_URL, force_rollback=True),
metadata=sqlalchemy.MetaData(),
)
class Company(ormar.Model):
ormar_config = base_ormar_config.copy(tablename="companies")
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
founded: int = ormar.Integer(nullable=True)
class Car(ormar.Model):
ormar_config = base_ormar_config.copy()
id: int = ormar.Integer(primary_key=True)
manufacturer = ormar.ForeignKey(Company)
name: str = ormar.String(max_length=100)
year: int = ormar.Integer(nullable=True)
gearbox_type: str = ormar.String(max_length=20, nullable=True)
gears: int = ormar.Integer(nullable=True)
aircon_type: str = ormar.String(max_length=20, nullable=True)
@create_drop_database(base_config=base_ormar_config)
async def sample_data():
# build some sample data
toyota = await Company.objects.create(name="Toyota", founded=1937)
await Car.objects.create(
manufacturer=toyota,
name="Corolla",
year=2020,
gearbox_type="Manual",
gears=5,
aircon_type="Manual",
)
await Car.objects.create(
manufacturer=toyota,
name="Yaris",
year=2019,
gearbox_type="Manual",
gears=5,
aircon_type="Manual",
)
await Car.objects.create(
manufacturer=toyota,
name="Supreme",
year=2020,
gearbox_type="Auto",
gears=6,
aircon_type="Auto",
)
asyncio.run(sample_data())
# select manufacturer but only name,
# to include related models use notation {model_name}__{column}
all_cars = await (
Car.objects
.select_related('manufacturer')
.exclude_fields([
'year',
'gearbox_type',
'gears',
'aircon_type',
'company__founded'
])
.all()
)
for car in all_cars:
# excluded columns will yield None
assert all(getattr(car, x) is None
for x in [
'year',
'gearbox_type',
'gears',
'aircon_type'
])
# included column on related models will be available,
# pk column is always included
# even if you do not include it in fields list
assert car.manufacturer.name == 'Toyota'
# also in the nested related models,
# you cannot exclude pk - it's always auto added
assert car.manufacturer.founded is None
# fields() can be called several times,
# building up the columns to select
# models included in select_related
# but with no columns in fields list implies all fields
all_cars = await (
Car.objects
.select_related('manufacturer')
.exclude_fields('year')
.exclude_fields(['gear', 'gearbox_type'])
.all()
)
# all fields from company model are selected
assert all_cars[0].manufacturer.name == 'Toyota'
assert all_cars[0].manufacturer.founded == 1937
# cannot exclude mandatory model columns,
# company__name in this example - note usage of dict/set this time
await (
Car.objects
.select_related('manufacturer')
.exclude_fields([{'company': {'name'}}])
.all()
)
# will raise pydantic ValidationError as company.name is required
|
!!!Peringatan, bidang wajib tidak dapat dikecualikan karena menimbulkan Kesalahan Validasi. Untuk mengecualikan bidang, itu harus dibatalkan.
| Metode `values()` dapat digunakan untuk mengecualikan bidang wajib, meskipun data akan
Dikembalikan sebagai `dict`.
|
!!! Tip bahwa kolom Pk tidak dapat dikecualikan - bahkan jika dikecualikan secara eksplisit, itu akan selalu ditambahkan secara otomatis.
Perhatikan
Jadi operasi seperti filter(),select_related(),limit() dan offset() dll dapat dirantai.
Sesuatu seperti Track.object.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()
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.
lapangan
Ini berfungsi persis seperti bidang di atas, tetapi memungkinkan Anda untuk memilih kolom dari objek terkait di ujung lain hubungan.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
bidang eksklusi
Sama seperti fungsi kecuali\ _ bidang di atas, tetapi memungkinkan Anda untuk memilih kolom dari objek terkait di ujung lain hubungan.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy