Lewati ke isi

Ladang piramida saja

Ormar memungkinkan Anda untuk mendeklarasikan bidang pydantic normal dalam modelnya, sehingga Anda dapat mengakses semua bidang pydantic dasar dan kustom seperti str, int, HttpUrl, PaymentCardNumber, dan banyak lagi.

Anda bahkan dapat menyatakan bidang yang mengarah ke model Pydantic bersarang saja, bukan hanya bidang individu.

Karena bidang ini tidak disimpan dalam database (yang merupakan inti dari bidang ini), Anda harus memberikannya nilai yang bermakna, baik dengan menetapkan nilai default atau selama inisialisasi model.

Jika Ormar tidak dapat menyelesaikan nilai bidang Pydantic, itu akan gagal selama memuat data dari database dan akan kekurangan nilai yang diperlukan untuk bidang Pydantic yang dinyatakan.

Opsi untuk memberikan nilai dijelaskan di bawah ini.

Tentu saja, Anda dapat menggabungkan beberapa atau semuanya menjadi satu model.

bidang opsional

Jika bidang diatur ke opsional, default ke "tidak ada" jika tidak disediakan, itulah yang terjadi selama pemuatan dari database.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
base _ ormar _ config = ormar. OrmarConfig (
    Metadata = sqlalchemy. MetaData (),
    Database = database. Database (DATABASE _ URL),
)


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

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

Tes = ModelTest (nama = "Tes")
Tegaskan test.name = = "Tes"
Tes penutup. nomornya Tidak ada
Nomor tes.= "123456789015"

Tunggu test.save
test _ check = menunggu ModelTest.objeks.get ()

Tegaskan test_check.name = = "Tes"
# setelah memuatnya kembali ke Tidak Ada
Tes pencuci mulut _ nomor cek Tidak Ada

Bidang dengan nilai default

Dengan menetapkan nilai default, nilai ini akan ditetapkan selama inisialisasi dan pemuatan database. Perhatikan bahwa mengatur nilai default ke "Tidak ada" sama dengan mengatur bidang ini ke "Opsional."

 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
base _ ormar _ config = ormar. OrmarConfig (
    Metadata = sqlalchemy. MetaData (),
    Database = database. Database (DATABASE _ URL),
)


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

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 200)
    Url: HttpUrl = "https://www.example.com"

Tes = ModelTest (nama = "Tes")
Tegaskan test.name = = "Tes"
Tegaskan test.url = = "https://www.example.com"

Test.url = "https://www.sdta.ada.pt"
Tegaskan test.url = = "https://www.sdta.ada.pt"

Tunggu test.save
test _ check = menunggu ModelTest.objeks.get ()

Tegaskan test_check.name = = "Tes"
# setelah memuat kembali ke default
Uji isi _ cek url = = "https://www.example.com"

Fungsi pabrik default

Dengan mengatur fungsi pabrik\ _ default, hasil panggilan fungsi diatur pada inisialisasi dan setiap kali database dimuat.

 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
Ladang yang diimpor dari pydantic, PaymentCardNumber
# ...


base _ ormar _ config = ormar. OrmarConfig (
    Metadata = sqlalchemy. MetaData (),
    Database = database. Database (DATABASE _ URL),
)


KARTU _ NOMOR = [
    "123456789007",
    "123456789015",
    "123456789023",
    "123456789031",
    "123456789049",
]


Pasti mendapatkan _ nomor ():
    Kembali secara acak. Pilihan (CARD _ NUMBERS)


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

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 200)
    # perhatikan bahwa Anda tidak memanggil fungsi, cukup berikan referensi
    Nomor: PaymentCardNumber = Lapangan (default _ factory = get _ number)

# perhatikan bahwa Anda masih BISA memberikan nilai
Tes = ModelTest2 (nama = "Test2," nomor = "4000000000000002")
Tegaskan test.name = = "Tes 2"
Tegaskan test.number = = "4000000000000002"

Tunggu test.save
test _ check = menunggu ModelTest2.objeks.get ()

Tegaskan test_check.name = = "Tes 2"
# setelah nilai beban ditetapkan menjadi salah satu CARD _ NUMBERS
Tes pencuci mulut _ periksa nomor di KARTU _ NUMBERS
Tes pencuci mulut _ periksa! = tes.

\ __init_\ _ pengaturan khusus

Anda dapat memberikan nilai untuk bidang ini dalam metode\ __init_\ _ () sebelum memanggil metode init super ().

 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
BaseModel diimpor dari pydantic
# ...


base _ ormar _ config = ormar. OrmarConfig (
    Metadata = sqlalchemy. MetaData (),
    Database = database. Database (DATABASE _ URL),
)


Kelas PydanticTest (Model Dasar):
    Aa: str
    Bb: petunjuk


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

    # berikan fungsi init kustom Anda
    Def _ _ init _ _ (diri, * * kwargs):
        # tambahkan nilai untuk bidang yang diperlukan tanpa nilai default
        Kwargs ["pydantic _ test"] = PydanticTest (aa = "random," bb = 42)
        # ingat untuk memanggil ormar. Model init!
        Super (). _ _ init _ _ (* * kwargs)

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 200)
    pydantic _ test: PydanticTest

Tes = ModelTest3 (nama = "Test3")
Tegaskan test.name = = "Test3"
Uji pendahuluan. pydantic_test.bb = = 42
Tes. pydantic.aa = "nilai baru"
Tegaskan tes.pydantic.aa = = "nilai baru"

Tunggu test.save
test _ check = menunggu ModelTest3.objeks.get ()

Tegaskan test_check.name = = "Test3"
# setelah memuat kembali ke nilai yang disediakan di init
Tes pencuci mulut _ periksa pydantic _ test = = "acak"

!!!Peringatan: Jika Anda tidak memberikan nilai dengan salah satu cara di atas, Kesalahan Validasi akan dilemparkan saat memuat dari database.