Skip to content

interior structure

In addition to the special parameters defined in the model during definition (table names, metadata, and so on), the model provides you with useful internal structure.

triangle model

All model classes inherit from pydantic.BaseModel, so you can access all the normal properties of the pydantic model.

For example, to list pydantic model fields, you can:

 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
import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)


print(Course.model_fields)
"""
Will produce:
{'id':        Field(name='id', 
                         type=Optional[int], 
                         required=False, 
                         default=None),
 'name':      Field(name='name', 
                         type=Optional[str], 
                         required=False, 
                         default=None),
'completed':  Field(name='completed', 
                         type=bool, 
                         required=False, 
                         default=False)}
"""

!!!Tip Note that the primary key id field is optional because integer primary keys are automatically incremented to True by default.

!!!info For more options, please visit pydantic's official documentation.

alchemical table

To access the automatically created sqlalchemy table, you can use the Model.ormar_config.table parameter

For example, to list table columns, you can:

 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
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 Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        tablename="courses",
        database=databases.Database(DATABASE_URL),
        metadata=sqlalchemy.MetaData(),
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)


print(Course.ormar_config.table.columns)
"""
Will produce:
ImmutableColumnCollection(courses.id, courses.name, courses.completed)
"""

!!!Tip You can access the table primary key name at Course.ormar_config.pkname

!!!info For more options, please visit the official sqlalchemy-metadata documentation.

field definitions

To access the ormar field, you can use the Model.ormar_config.model_fields range

For example, to list table model fields, you can:

  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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import pprint

import databases
import ormar
import sqlalchemy

database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()


class Course(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=metadata,
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    completed: bool = ormar.Boolean(default=False)


pprint.pp({x: v.__dict__ for x, v in Course.ormar_config.model_fields.items()})
"""
Will produce:
{'id': {'__type__': <class 'int'>,
        '__pydantic_type__': <class 'int'>,
        '__sample__': 0,
        'related_name': None,
        'column_type': Integer(),
        'constraints': [],
        'name': 'id',
        'db_alias': None,
        'primary_key': True,
        'autoincrement': True,
        'nullable': True,
        'sql_nullable': False,
        'index': False,
        'unique': False,
        'virtual': None,
        'is_multi': None,
        'is_relation': None,
        'is_through': False,
        'through_relation_name': None,
        'through_reverse_relation_name': None,
        'skip_reverse': False,
        'skip_field': False,
        'owner': <class '__main__.Course'>,
        'to': None,
        'to_pk_only': None,
        'through': None,
        'self_reference': False,
        'self_reference_primary': None,
        'orders_by': None,
        'related_orders_by': None,
        'encrypt_secret': None,
        'encrypt_backend': <EncryptBackends.NONE: 0>,
        'encrypt_custom_backend': None,
        'ormar_default': None,
        'server_default': None,
        'comment': None,
        'represent_as_base64_str': False,
        'minimum': None,
        'maximum': None,
        'multiple_of': None,
        'ge': None,
        'le': None},
 'name': {'__type__': <class 'str'>,
          '__pydantic_type__': <class 'str'>,
          '__sample__': 'string',
          'related_name': None,
          'column_type': String(length=100),
          'constraints': [],
          'name': 'name',
          'db_alias': None,
          'primary_key': False,
          'autoincrement': False,
          'nullable': False,
          'sql_nullable': False,
          'index': False,
          'unique': False,
          'virtual': None,
          'is_multi': None,
          'is_relation': None,
          'is_through': False,
          'through_relation_name': None,
          'through_reverse_relation_name': None,
          'skip_reverse': False,
          'skip_field': False,
          'owner': <class '__main__.Course'>,
          'to': None,
          'to_pk_only': None,
          'through': None,
          'self_reference': False,
          'self_reference_primary': None,
          'orders_by': None,
          'related_orders_by': None,
          'encrypt_secret': None,
          'encrypt_backend': <EncryptBackends.NONE: 0>,
          'encrypt_custom_backend': None,
          'ormar_default': None,
          'server_default': None,
          'comment': None,
          'represent_as_base64_str': False,
          'max_length': 100,
          'min_length': None,
          'regex': None},
 'completed': {'__type__': <class 'bool'>,
               '__pydantic_type__': <class 'bool'>,
               '__sample__': True,
               'related_name': None,
               'column_type': Boolean(),
               'constraints': [],
               'name': 'completed',
               'db_alias': None,
               'primary_key': False,
               'autoincrement': False,
               'nullable': True,
               'sql_nullable': True,
               'index': False,
               'unique': False,
               'virtual': None,
               'is_multi': None,
               'is_relation': None,
               'is_through': False,
               'through_relation_name': None,
               'through_reverse_relation_name': None,
               'skip_reverse': False,
               'skip_field': False,
               'owner': <class '__main__.Course'>,
               'to': None,
               'to_pk_only': None,
               'through': None,
               'self_reference': False,
               'self_reference_primary': None,
               'orders_by': None,
               'related_orders_by': None,
               'encrypt_secret': None,
               'encrypt_backend': <EncryptBackends.NONE: 0>,
               'encrypt_custom_backend': None,
               'ormar_default': False,
               'server_default': None,
               'comment': None,
               'represent_as_base64_str': False}}
"""

!!!info Note that the fields stored on the model are classes, not instances.

1
2
3
4
5
6
7
So if you print just model fields you will get:

`{'id': <class 'ormar.fields.model_fields.Integer'>, `

  `'name': <class 'ormar.fields.model_fields.String'>, `

  `'completed': <class 'ormar.fields.model_fields.Boolean'>}`