Только поля Pydantic
Ormar позволяет объявлять обычные поля pydantic в своей модели, так что вы можете получить доступ ко всем базовым и настраиваемым полям pydantic, таким как str, int, HttpUrl, PaymentCardNumber и т. д.
Вы даже можете объявить поля, ведущие только к вложенным pydantic моделям, а не только к отдельным.
Поскольку эти поля не хранятся в базе данных (это все значения этих полей), необходимо задать для них значимые значения, либо путем установки значения по умолчанию, либо во время инициализации модели.
Если ormar не может разрешить значение поля pydantic, то при загрузке данных из базы данных произойдет сбой, а требуемые значения для поля pydantic отсутствуют.
Ниже описаны параметры для получения значений.
Конечно, вы можете объединить некоторые или все из них в одну модель.
Необязательное поле
Если поле является необязательным, то если оно не доступно, по умолчанию используется значение "Нет", что происходит при загрузке из базы данных.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | «Органа»((
metadata= sqalchemy (),
Database=databases.Database(DATABASE),
)
Class ModelTest(ormar.Model):
ormar_config = base_ormar_config ()
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =200)
Номер: Optional[PaymentCardNumber]
test = ModelTest(name="Test")
assert test.name == "Test"
Тест: Номер не имеет
test.number = "123456789015"
test.save (
test_check = await ModelTest.objects ()
assert test_check.name == "Test"
# after load it's back to None
assert test_check.number is None
|
Поля со значениями по умолчанию
Устанавливая значение по умолчанию, оно устанавливается при инициализации и загрузке базы данных. Обратите внимание, что установка значения по умолчанию "Нет" соответствует установке поля на "Необязательно".
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 | «Органа»((
metadata= sqalchemy (),
Database=databases.Database(DATABASE),
)
Class ModelTest(ormar.Model):
ormar_config = base_ormar_config ()
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =200)
url: HttpUrl = "https://www.example.com"
test = ModelTest(name="Test")
assert test.name == "Test"
assert test.url == "https://www.example.com"
test.url = "https://www.sdta.ada.pt"
assert test.url == "https://www.sdta.ada.pt"
test.save (
test_check = await ModelTest.objects ()
assert test_check.name == "Test"
# after load it's back to default
assert test_check.url == "https://www.example.com"
|
Параметрический ряд по умолчанию
При установке функции default_factory результаты вызова функции задаются при инициализации и каждой загрузке базы данных.
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 | Из pydantic import Field, PaymentCardNumber
# ...
«Органа»((
metadata= sqalchemy (),
Database=databases.Database(DATABASE),
)
CARD_NUMBERS = [
"123456789007",
"123456789015",
"123456789023",
"123456789031",
"123456789049",
]
def get_number ():
Return random.choice (CARD_NUmbers)
Class Model2 (Ormar.Model)
ormar_config = base_ormar_config ()
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =200)
Комментарии, которые вы не называете, просто пропустите ссылку
Номер: PaymentCardNumber = Field(default_factory = get_number)
# note that you still CAN providide a value
test = ModelTest2(name="Test2", number="400000000002")
assert test.name = "Test2"
assert test.number = "40000000000002"
test.save (
test_check = await ModelTest2.objects.get()
assert test_check.name == "Test2"
# after load value is set to be one of the CARD_NUMBERS
assert test_check.number in CARD_NUMBERS
assert test_check.number!= test.number.
|
Пользовательские настройки в__init_\
Для этого поля можно задать значение в методе__init__() перед вызовом метода super() init.
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 | Из Pydantic Import BaseModel
# ...
«Органа»((
metadata= sqalchemy (),
Database=databases.Database(DATABASE),
)
class PydanticTest(BaseModel)
aa: str
Bb: int
Модель Test3 (ormar.Model):
ormar_config = base_ormar_config ()
#Обеспечьте свою собственную пользовательскую функцию
def_init_(self, **kwargs):
# add value for required field without default value
kwargs["pydantic_test"] = Pydantictest(aa="random", bb=42)
# remember to call ormar.Model init!
super()._init__(**kwargs)
id: int = ormar.Integer(primary_key =True)
name: str = ormar.String(max_length =200)
pydantic_test: PydanticTest
test = ModelTest3(name="Test3")
assert test.name = "Test3"
assert test.bb == 42
test.pydantic.aa = "new value"
assert test. pydantic.aa == "new value"
test.save (
test_check = await ModelTest3.objects.get()
assert test_check.name == "Test3"
# after load it's back to value provided in init
assert test_check.pydantic_test.aa == "random"
|
!!!Предупреждение, если значение не указано одним из вышеуказанных способов, при загрузке из базы данных будет генерироваться ValidationError.