Aller au contenu

Champs Pydantiques uniquement

Ormar vous permet de déclarer des champs pydantiques normaux dans son modèle, de sorte que vous pouvez accéder à tous les champs pydantiques de base et personnalisés tels que str, int, HttpUrl, PaymentCardNumber, et plus encore.

Vous pouvez même déclarer des champs qui mènent à un modèle pydantique imbriqué uniquement, plutôt qu'à un seul champ.

Comme ces champs ne sont pas stockés dans la base de données (c'est tout ce qu 'ils sont), vous devez leur fournir une valeur significative, soit en définissant une valeur par défaut, soit lors de l'initialisation du modèle.

Si ormar ne parvient pas à résoudre la valeur du champ pydantique, il échouera lors du chargement des données à partir de la base de données et la valeur requise pour le champ pydantique déclaré est manquante.

Les options pour fournir une valeur sont décrites ci-dessous.

Bien sûr, vous pouvez combiner certains ou tous ces éléments dans un modèle.

Champ optionnel

Si vous définissez un champ sur optionnel, il est par défaut « Aucun » s'il n'est pas fourni, ce qui est exactement ce qui se passe lors du chargement à partir de la base de données.

 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=databases.Database(DATABASE_URL),
)


Classe Modèle Test (modèle ormar):
    ormar_config = base_ormar_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=200)
    Numéro: Optional[numéro de carte de paiement]

test = ModelTest(name="Test")
assert test.name == "Test"
assert test.number is None
test.number = "123456789015"

await test.save ()
test_check = await ModelTest.objects.get()

assert test_check.name == "Test"
#après avoir chargé son retour vers None
assert test_check.number is None

Champs avec des valeurs par défaut

En définissant une valeur par défaut, celle-ci sera définie lors de l'initialisation et du chargement de la base de données. Notez que définir la valeur par défaut sur Aucun revient à définir le champ sur Facultatif.

 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=databases.Database(DATABASE_URL),
)


Classe Modèle Test (modèle ormar):
    ormar_config = base_ormar_config.copy()

    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"
test assert.url == "https://www.example.com"

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

await test.save ()
test_check = await ModelTest. objets.get()

assert test_check.name == "Test"
#après avoir chargé son retour par défaut
assert test_check.url === "https://www.example.com"

Fonctionnalités par défaut Factory

En définissant la fonction default_factory, le résultat de l'appel de fonction sera défini à l'initialisation et à chaque chargement de base de données.

 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
de champ d'import pydantique, PaymentCardNumber
# ...


base_ormar_config = ormar.ormarConfig(
    metadata=sqlalchemy.MetaData(),
    database=databases.Database(DATABASE_URL),
)


CARD_NUMBERS = [
    "123456789007",
    "123456789015",
    "123456789023",
    "123456789031",
    "123456789049",
]


def get_number():
    return random.choice(CARD_NUMBERS)


Classe ModelTest2(modèle ormar):
    ormar_config = base_ormar_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=200)
    # note que vous ne faites pas appel à la fonction, passez simplement la référence
    Number: PaymentCardNumber = Field(default_factory=get_number)

# note que vous ne pouvez pas fournir une valeur
test = ModelTest2(nom ="Test2", numéro ="4000000000002")
assert test.name == "Test2"
assert test.number == "400000000000002"

await test.save ()
test_check = await ModelTest2.objects ()

assert test_check.name == "Test2"
#après la valeur de chargement est définie pour être une des CARD_NUMBERS
assert test_check.number in CARD_NUMBERS
assert test_check.number != test. nombre

__initié_Custom Settings dans_

Vous pouvez fournir une valeur pour ce champ dans la méthode__init__() avant d'appeler la méthode 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
de l'import pydantique BaseModel
# ...


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


Classe PydanticTest(BaseModel):
    a: str
    bb: int


Classe ModelTest3(modèle. ormar):
    ormar_config = base_ormar_config.copy()

    # Provide Your Custom init function
    Def __init__(self, **kwargs):
        #ajouter une valeur pour le champ requis sans valeur par défaut
        kwargs["pydantic_test"] = Pydantic Test (aa="random", bb=42)
        # remember pour appeler l'ormar.Model init!
        super().__init__(**kwargs)

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=200)
    pydantic_test: Pydantic Test

Test = ModelTest3(nom ="Test3")
assert test.name == "Test3"
assert test.pydantic_test.bb == 42
test.pydantic.aa = "nouvelle valeur"
test assert.pydantic.aa == "nouvelle valeur"

await test.save ()
test_check = await ModelTest3.objects.get()

assert test_check.name == "Test3"
#après avoir chargé son retour à la valeur fournie dans init
assert test_check.pydantic_test.aa == "random"

!!!AVERTISSEMENT Si vous ne fournissez pas de valeur de l'une des manières décrites ci-dessus, une ValidationError sera levée lors du chargement à partir de la base de données.