Примечания к версии
0.20.1
» Значительные изменения
- Пожалуйста, обратите внимание, что это первая небета-версия ormar с поддержкой Pydantic v2. Ознакомьтесь с примечаниями к выпуску 0.20.0 и https://collerek.github.io/ormar/0.20.0b1/migration/
»Ремонт
- Исправлена ошибка, когда одна целевая модель объединяется при использовании select_lated и prefetch_lated #906
- Исправление проблемы сохранения, связанной с моделью только pk #812
- Исправление Добавление одной и той же связи несколько раз повреждает кэш связи #1335
» Особенности
- Разрешить добавление внешнего ключа #1276 @cmflynn
»Прочее
- Chaoyingz исправил некоторые документы, спасибо!
0.20.0
» Значительные изменения
-
Модель Oma
Теперь для каждой модели ormar требуется параметр ormar_config, который является экземпляром класса OrmarConfig, а не определяет класс Meta. Обратите внимание, что атрибут должен иметь имя ormar_config и быть экземпляром класса config.
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
Import Data abases import ormar sqimport alchemy databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData # ormar < 0.20 Class Album(Ormar): Класс Meta: database = база данных metadata = metadata tablename = "albums" id: int = ormar. Integer (primary_key = True) name: str = ormar. String (max_length = 100) bool = ormar. Boolean (default = False) #ormar>= 0,20 Class AlbumV20 (модель ormar.): Органом-де-Органом-Органом-де-Органом-Органом ( database = база данных, Метаданные = метаданные, tablename ="albums_v20" ) id: int = ormar. Integer (primary_key = True) name: str = ormar. String (max_length = 100) bool = ormar. Boolean (default = False) -
OrmarConfig api/параметры
ormar_config предоставляет тот же набор настроек, что и класс Meta. Это означает, что вы можете инициализировать конфигурацию с помощью любого из следующих параметров:
1 2 3 4 5 6 7 8 9 10
Metadata: Optional (sqlchemy. MetaData) Database: Optional [databases.Database] Engine: Optional (sqlalchemy.engine.Engine) tablename: Optional [str] Order_by: Optional [List [str]] Abstract: bool exclude_parent_fields: Optional [List [str]] queryset_class: Тип (QuerySet) Extra: Extra constraints: Optional [List [ColumnCollectionConstraint]] -
Эквиваленты BaseMeta-Лучшие Лрактики
Обратите внимание, что для уменьшения дублирования кода и упрощения разработки по-прежнему рекомендуется создать базовую конфигурацию и предоставить копию каждой модели. OrmarConfig предлагает удобный способ копирования для этого.
Метод copy принимает те же параметры, что и init OrmarConfig, поэтому вы можете переопределить их по мере необходимости, но по умолчанию возвращает существующие атрибуты, за исключением tablename, order_by и зависимостей, которые по умолчанию удаляются.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Import Data abases import ormar Sqimport alchemy «Органа»(( Database=databases.Database("sqlite:///db.sqlite") Metadata= sqalchemy.MetaData ) Class AlbumV20(модель ormar.): 10.00.201.201.201.2011 tablename='albums_v20'' ) id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) Class TrackV20(Ormar): 10.00.201.201.201.2011 tablename="tracks_v20" ) id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) -
Параметры поля options больше не поддерживаются.
До версии 0.20 вы могли ограничить допустимые значения, предоставив параметры параметров для любого существующего поля ormar. Эта функция была удалена, и вы должны использовать поле ormar.Enum, разработанное для этой цели. Если вы хотите сохранить тип поля базы данных (т. е. целое поле), вы можете написать пользовательский валификатор в любое время.
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
Import Data abases import ormar Sqimport alchemy databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData # ormar < 0.20 Класс Artist(Ormar.Model) Класс Meta: database = база данных metadata = metadata id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) Country: str = ormar.String(default=False, max_length =50, choices=["UK", "US", "Vietnam", "Colombia"]) # ormar >= 0.20 Из импорта Enum Импорт Enum class Country(str, Enum): Великобритания = "UK" US =«US » VIETNAM = "Vietnam" Colombia =«Colombia» Class ArtistV20(Ormar): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, tablename="artists_v20" ) id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) Country: Country = ormar.Enum(enum_class =Country) -
pydantic_only больше не поддерживает параметры поля
Поле pydantic_only было заброшено и удалено в v 0.20. 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 25 26 27 28 29
Import Data abases import ormar Sqimport alchemy databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData # ormar < 0.20 Class Dish(Ormar.Model): Класс Meta: database = база данных metadata = metadata tablename = dishes id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) cook: str = ormar.String(max_length =40, pydantic_only =True, default="sam") # ormar >= 0,20 Class DishV20(Ormar.Model): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, tablename='dishes_v20'' ) id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) cook: str = "sam" # this is Normal pydantic field -
Больше не поддерживается отделка property_field
Property_field Уделка используется для передачи словаря/сериализации метода расчета полей, содержащихся в представлении модели. Версия pydantic 2. X представляет эту возможность, поэтому теперь вы должны перейти на собственную версию 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 25 26 27 28 29 30 31 32 33 34 35 36
Import Data abases import ormar Sqimport alchemy Import Pydantic databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData # ormar < 0.20 Класс Employee(ormar.Model): Класс Meta: database = база данных metadata = metadata id: int = ormar.Integer(primary_key =True) first_name: str = ormar.String(max_length =100) last_name: str = ormar.String(max_length =100) ormar.property (). defull name(self) -> str: Return f '{self.first_name} {self.last_name}" # ormar >= 0.20 class EmployeV20 (Ormar.Model): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, ) id: int = ormar.Integer(primary_key =True) first_name: str = ormar.String(max_length =100) last_name: str = ormar.String(max_length =100) Pydantic.computed_field () defull name(self) -> str. Return f"{self.first_name} {self.last_name}" -
Отброшенные методы
Все перечисленные ниже методы устарели и будут удалены в версии 0.30.
-
Dict() становится моделью_dump ()
Import Data abases import ormar Sqimport alchemy
databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData
Class Album(Ormar): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, tablename="albums" )
1 2 3
id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) bool = ormar.Boolean(default=False)Альбом (name=«Dark Side of the Moon»)
ormar < 0.20
album.dict = album.dict ()
ormar >= 0.20
new_album_dict = album. model_dump ()
Обратите внимание на то, что параметры остаются неизменными, т. е. включают, исключают и т. д.
-
json() становится моделью_dump_json ()
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
Import Data abases Import ormar sqimport alchemy databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData Class Album(Ormar): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, tablename="albums" ) id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) bool = ormar.Boolean(default=False) Альбом (name=«Dark Side of the Moon») # ormar < 0.20 Альбомы = album.json ( # ormar >= 0,20 new_album_dict = album. model_dump_jsonОбратите внимание на то, что параметры остаются неизменными, т. е. включают, исключают и т. д.
-
construct() становится моделью_construct ()
Import Data abases Import ormar Sqimport alchemy
databases.Database("sqlite:///db.sqlite") Metadata = sqalchemy.MetaData
Class Album(Ormar): Органом-де-Органом-Органом-де-Органом-Органом ( database= база данных, Метаданные = метаданные, tablename="albums" )
1 2 3
id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) bool = ormar.Boolean(default=False)Params = { Название: Dark Side of the Moon. «favorite»: Истинно, }
ormar < 0.20
Album = альбом.construct(**params)
ormar >= 0.20
Альбом: model_construct (**params)
Для получения дополнительной информации о конструкции см. документацию по pydantic.
-
0.12.2
…Особенности
- Поддержка FastAPI до последней версии (0.97.0)#1110
- Добавлена поддержка и тестирование Python 3.11 #110
0.12.1
…Особенности
- Производительность при загрузке моделей значительно улучшилась благодаря рекурсивной загрузке и кэшированию моделей и связанных с ними моделей.(@erichaydel -Спасибо!)#853
-внутренняя структура
- Сравнение реализованных тенденций изменения производительности эталонов (опять же,@erichaydel -Спасибо!)#853
0.12.0
значительные изменения
- Queryset.bulk_create теперь будет генерировать ModelListEmptyError на пустом списке моделей (@ponytailer -Спасибо!)#853
…Особенности
- Model.upsert () теперь обрабатывает флаг__force_save__: bool, который позволяет обновлять вставленные модели независимо от того, установлен ли в них первичный ключ. Обратите внимание, что установка этого флажка приведет к двум запросам для каждой модели, вставленной при обновлении-> get проверяет наличие модели, а затем выполняет соответствующие обновления/вставки. Глава 889
-Ремонт
- Исправлено отношение пространства, нарушающее метод построения (@ Abdeldjalil-H-Спасибо!)#870
- Исправлена ошибка, связанная с сохранением моделей с установленными pks (включая uuid)#885
- Исправление Исправление Исключено из связи ошибок #779
- Исправлена ошибка наследования property_fields #774
0.11.3
…Особенности
- записывает действия ссылок onupdate и ondelete в ForeignKey и предоставляет перечисление ReferentialAction, чтобы указать поведение отношений (@ SeepehrBazyar-Спасибо!)#724
- Добавление CheckColumn к поддерживаемым ограничениям в Meta модели (@ SeepehrBazyar-Спасибо!)#729
-Ремонт
- Исправление Ограничить результаты запроса до 0 должен вернуть пустой список (@ SeepehrBazyar-Спасибо!)#766
Прочее💬
- Добавить темный режим в документ (@ SeepehrBazyar-Спасибо!)#717
- Обновлено aiomysql Зависимость #778
0.11.2
-Ремонт
- Восстановление драйверов базы данных необходимо, и они должны быть необязательными #713
- Исправлена проблема с логическим полем #704 в запросах ограничений без флага limit_raw_sql в postgres
- Исправлена ошибка #699 OpenAPI, вызванная переполнением enum_class в архитектуру
0.11.1
-Реконструкция
- Исправлена проблема глубокой репликации, введенная в pydantic 1.9 #685
0.11.0
значительные изменения
- Отказ от поддержки Python 3.6
- Queryset.get_or_create теперь возвращает кортеж, содержащий модель и логические значения, указывающие, была ли модель создана (@MojixCoder -Спасибо!)#554
- Queryset.count () теперь вычисляет количество строк разных родительской модели по умолчанию, можно вычислить все строки, задав unique=False (@ erichaydel-Спасибо)#588
…Особенности
- Была добавлена поддержка Python 3.10.
-Реконструкция
- Исправлено непоследовательное поведение поля JSON в save и bulk_create #584
- Исправлена самая большая ошибка #580
0.10.25
…Особенности
- добавляет опцию queryset_class в Model.Meta, что позволяет легко заменить QuerySet на вашу модель (@ponytailer -Спасибо!)#538
- позволяет передавать дополнительные kwargs в IndexColumns, и эти столбцы индекса будут переданы в sqlalchemy Index (@zevisert -Спасибо)#575
-Реконструкция
- Исправлена допустимая настройка пустых полей JSON #529
- Исправлено несоответствие bytes/str в пакетных операциях при использовании orjson вместо Json (@ponytailer -Спасибо!)#538
0.10.24
…Особенности
- Добавить сигнал post_bulk_update (@ponytailer -Спасибо!)#524
-Реконструкция
- Исправлена поддержка pydantic== 1.9.0 #502
- Исправление проблемы с датой и временем #504
- удаляет текстовые привязки из генерирования запросов, чтобы разблокировать массив postgres #/tophat/ormar-postgres-extensions/9
- Исправлено массовое обновление поля JSON #519
Прочее💬
- улучшает производительность bulk_create, обходя databaseexecute_many второстепенную реализацию.(@ Mng-dev-ai спасибо!)#520
- Ударная минута. Необходимая версия базы данных>=5.4.
0.10.23
…Особенности
- Добавлена возможность передавать комментарии в sqlalchemy при создании столбца #485
-Реконструкция
- Исправлено поле LargeBinary #409
- Сделать ormar.Model Доступность #413
- Позволяет first() и get() соблюдать порядок, заданный пользователем в главной модели, без параметров, вернуться к первичным ключам (asc и desc, соответственно)#453
- Исправлена неправильная ссылка на предложение соединения, не являющееся псевдонимом #455 в postgress
0.10.22
-Реконструкция
- Горячее исправление при настройке родительской модели ormar валидатор не наследуется #365
0.10.21
-Ремонт
- добавляет реализацию ormar метода конструктора, который позволяет создавать экземпляры модели без проверки входных данных, чтобы ускорить весь процесс (если ваши данные уже проверены)#318
- исправлена ошибка, связанная с «наследованием» валидатора поля из модели ormar при использовании get_pydantic #365 для создания вновь созданной модели pydanic
0.10.20
…Особенности
- добавляет дополнительные параметры в Model.Meta, которые принимают Extra.ignore и Extra.forbid (по умолчанию), пропускают дополнительные поля, передаваемые модели ormar, или вызывают исключение #358 при появлении исключения
-Ремонт
- Если поле может быть пустым и заданы параметры, значение "Нет"#354 не допускается
- Независимо от автоматического инкрементного или явного пустого значения, всегда устанавливайте значение Primary_key не пустым, чтобы избежать проблем с миграцией #348
0.10.19
…Особенности
- Добавлена поддержка нескольких столбцов Inconstraints #307.
- добавляет свойство поля sql_nullable, что позволяет установить различные параметры #308 для модели pydantic и базового столбца SQL.
-Реконструкция
- Включение кэширования диаграмм для повышения производительности #337
- Уточнение и исправление документов #339, содержащих пустые поля
Прочее💬
- Обновление поддерживаемой версии базы данных до <=5.2.
0.10.18
-Ремонт
- Исправление порядка полей в модели pydantic #328
- Восстановление базы данных 0.5.0 Поддержка #142
0.10.17
…Особенности
- Тип pydantic по умолчанию #312 позволяет переопределить поля модели
- Добавлена поддержка sqlalchemy >=1.4 (необходима база данных>= 0.5.0)#142
0.10.16
…Особенности
- позволяет передавать свою собственную конфигурацию pydantic в ormar.Model, которая будет объединена с конфигурацией по умолчанию @ naturleethic (спасибо!)#285
- Добавить тип поля SmallInteger (спасибо!)#297 @ ProgrammerPlus1998
-Ремонт
- Исправляет генерируемый режим openapi путем удаления устаревших параметров поля pydantic, которые доступны непосредственно в режиме #291
- Исправлено ненужное предупреждение, автоматически сгенерированное с помощью модели #295
0.10.15
-Ремонт
- Исправлена проблема с использованием вложенных моделей для создания деревьев pydantic модели (@pawamoy -Спасибо!)#278
- Исправлена недостающая строка f#274 в предупреждениях об отсутствии поля ключа
- Исправлено Перенос внешних ключей как связей (дополнительная защита, исправлена в последней версии)#270
0.10.14
…Особенности
- позволяет передавать параметр timezone:bool = False в поле DateTime и Time #264 в столбце базы данных с учетом часовых поясов
- позволяет передавать дату, время и время в полях DateTime, Time и Date Фильтрация, позволяя фильтровать по дате и времени вместо преобразования значений в строку #79
-Реконструкция
- Исправлена зависимость от psycopg2 к psycopg 2-binary #255
0.10.13
…Особенности
-
позволяет передавать доступ к полям в select_lated и prefetch_lated. Стиль python select_related #225.
-
Ранее:
Post.objects.select (["author", "categories"]).get() await Author.objects.prefetch_related ("posts__categories").get()
-
Также сейчас:
Post.objects.select www.example.com_related ([Post.author, Post.categories]).get() await Author.objects.prefetch_related (Author.posts.categories).get()
-
-Ремонт
- Исправлено значение по умолчанию #253 для переопределения унаследованного первичного ключа
0.10.12
-Ремонт
- Исправление метода QuerySet.create без init (если имеется настройка)#245
- Исправлена ошибка в настройках отношений ForwardRefManyToMany Тип pydantic #250
0.10.11
…Особенности
- добавляет значения и значения_list в QuerySet и QuerysetProxy, позволяя возвращать исходные данные из запроса #223.
- Разрешить возврат списка кортежей или словарей из запроса
- Пропустить анализ данных в модели ormar и, следовательно, пропускать проверку
- Позволяет исключать модели между цепями связей, поэтому можно извлечь только нужные столбцы.
- При извлечении только одного столбца values_list позволяет выровнять результаты.
-Реконструкция
- Исправлена ошибка с помощью ForwardRef #226 для автоматического создания на основе реляционной модели m2m
0.10.10
…Особенности
- добавляет логотип get_pydantic, который позволяет автоматически генерировать эквивалентные деревья моделей pydantic из ormar.Model. Это вновь сгенерированное дерево моделей можно использовать в запросах и ответах, чтобы исключить поля, которые вы не хотите включать в данные.
- добавляет параметр except_parent_fields в Meta модели, что позволяет исключить поля из родительской модели при наследовании. Обратите внимание, что лучше всего объединять модели и mixins, но если у вас есть много похожих моделей и только одна модель, это может быть полезным инструментом для этого.
-Реконструкция
- Исправлен пустой фильтр с страницами и связями (предоставленный @erichaydel)#214
- Исправление Если не сохранено до #216, подобъекты не сохраняются на обратной стороне связи
Прочее💬
- Разверните раздел документа fastapi, чтобы показать пример использования ormar в запросах и ответах fastapi.
- Улучшить документацию по умолчанию, ForeignKey.add и т. д.
0.10.9
важные исправления безопасности
- Обновить выводы pydantic для устранения уязвимости CVE-2021 -29510
Рекомендуется обновить до исправленной версии pydantic. В 0.10.9 Ormar исключает версию с уязвимостью в фиксированных зависимостях.
-Ремонт
- Исправлена архитектура OpenAPI LargeBinary #204
0.10.8
-Реконструкция
- Исправление значения по умолчанию #202 заливки в подмодели pk_only
- Использование base64 str для mypy #199 для исправления поля LargeBinary
- Исправление формата архитектуры OpenAPI с полем Large Binary в представлении Base64 str #199
- Исправлена кодировка выбора OpenAPI в поле Large Binary с представлением Base64 str
0.10.7
…Особенности
- добавляет метод
exclude_primary_keys: bool = False, помеченный как dict(), что позволяет исключить все столбцы ключевых ключей из словаря результатов. Глава 164 - добавляет логотип
exclude_through_models: bool = Falsedict(), что позволяет исключить все модели из отношений ManyToMany #164 - добавляет параметр
represent_as_base64_str: bool = False, который позволяет преобразовывать байтовые поля LargeBinary в строку, закодированную base64. При доступе к свойству строка возвращается в dict(), а строка преобразуется в байты. Данные в базе данных хранятся в байтах. Глава 187. - Добавление псевдонима pk для доступа Model.pk к полям в фильтре и предложении order by (стиль Python)
-Реконструкция
- Параметр None по умолчанию #186 для удаления max_length из поля LargeBinary
- Параметр None по умолчанию для удаления строки max_length
Прочее💬
- Инструкции и примеры для включения параметра dict() в документ
- Основной рефакторинг получения/настройки свойств в магическом методе в дескрипторы-> Значительные улучшения производительности
0.10.6
…Особенности
-
Добавить тип поля LargeBinary(max_length)#166
-
добавил поддержку обычных полей pydantic (включая модели) вместо свойства pydantic_only, которое теперь не используется #160. Поля Pydantic должны быть объявлены так же, как и в модели pydantic рядом с полем ormar. Обратите внимание, что (очевидно) ormar не сохраняет и не загружает значения этого поля в базу данных, что означает, что одно из следующих значений должно быть истинным:
- Поле pydantic, объявленное на модели ormar, должно быть необязательным (по умолчанию None)
- Для поля pydantic необходимо задать значение по умолчанию
- Поле pydantic имеет набор функций default_factory
- имеет поле ormar. Модель должна переписать__init__() и предоставить значение там
Если ни один из вышеописанных ормар (или, точнее, pydantic) не сработает при загрузке данных из базы данных и отсутствует значение, требуемое для заявленного поля pydantic.
-
Ormar теперь предлагает интересные примеры из режима openapi, включая вложенные модели. Итерации связанных моделей с использованием тех же алгоритмов, что и dict() и select/load_all, не обязательно просматриваются. Примеры также доступны в fastapi. Глава 157
-Ремонт
- по умолчанию pydantic не проверяет поля во время назначения, что не идеально подходит для ORM, и теперь все ormar.Models включают аутентификацию во время назначения (например, model.column = 'value')
Прочее💬
- Добавление подключения к базе данных в QuickStart readme #180 Архитектура* OpenAPI больше не содержит строку документа ormar.Model в качестве описания, а если вы не предоставляете собственную строку документа, то только имя модели.
- Некоторые улучшения производительности.
0.10.5
-Реконструкция
- Исправление ошибки #73 в fastapi-pagination
- удаляет ненужный Optional #174 из списка[Optional[T]] в возвращенных значениях List\
- Выполнение тестового покрытия публикуется только на внутренних prs, а не в Github.
0.10.4
…Особенности
- добавляет строки в стиле Python
filterиorder_by, которые используют поля для доступа, а не разделенные dunder строки. Глава 51- Поля доступа через атрибут доступа (цепочка символов точек) можно использовать для создания FilterGroups (ormar.and_и ormar.or_)
- Поле доступа перезагружен набор операторов Python и предоставляет набор функций, чтобы разрешить с**Функция с тем же именем для параметра dunder в kwargs, что означает, что запрос из примера Track модели, связанного с Album модели, теперь у вас есть больше вариантов:
- Точность-точное соответствие значению, столбец SQL =
- старый: album__name__exact ='Malibu'
- Новый: также можно написать Track.album.name = 'Malibu
- iexact -точное соответствие столбцам SQL =
(без учета регистра) - старый: album__name__iexact ='malibu'
- Новое: можно также написать
Track.album.name.iexact('malibu')
- содержит-SQL столбец LIKE '%
%' - старый: album__name__contains ='Mal'
- Новый: также можно написать как Track.album.name % 'Mal')
- Новое: можно также написать
Track.album.name.contains('Mal')
- icontains - SQL столбец LIKE '%
%'(без учета регистра) - старый: album__name__icontains ='mal'
- Новое: можно также написать
Track.album.name.icontains('mal')
- В-SQL
column IN (<VALUE1>, <VALUE2>, ...)- Старые:
album__name__in=['Malibu', 'Barclay'] - Новое: можно также написать
Track.album.name << ['Malibu', 'Barclay'] - Новое: можно также написать
Track.album.name.in_(['Malibu', 'Barclay'])
- Старые:
- isnull - sql IS NULL (и sql IS NOT NULL)
- старый: album__name__isnull=True (isnotnullalbum__name__isFalse = null)
- Новый: также можно написать на Track.album.name> Нет
- Название: Track. album.name.isnull(True)
- Не ноль можно написать и
Track.album.name.isnull(False) - Не null может быть написано (Track.album.name >> None)
- Не ноль можно написать и
~(Track.album.name.isnull(True))
- gt-sql столбец>
(больше) - Предыдущий: position__gt =3
- Новый: также можно написать на Track.album.name> 3
- gte - sql столбец>=
(больше или равно) - Предыдущий: position__gte =3
- Новый: также можно написать на Track.album.name>= 3
- lt-sql столбец <
(ниже) - Предыдущий: position__lt =3
- Новый: также можно написать на Track.album.name < 3
- lte - sql столбец <=
(ниже равно) - Предыдущий: position__lte =3
- Новый: также можно написать как Track.album.name <= 3
- startswith-sql столбец LIKE '
%'(точное начало совпадения) - Старый альбом: альбом_name__startswith ='Mal'
- Новое: можно также написать
Track.album.name.startswith('Mal')
- startswith sql столбец LIKE '
%'(без учета регистра) - Старые:
album__name__istartswith='mal' - Новое: можно также написать
Track.album.name.istartswith('mal')
- Старые:
- endswith -SQL столбец LIKE '%
'(полное совпадение) - старый: album__name__endswith ='ibu'
- Новое: можно также написать
Track.album.name.endswith('ibu')
- iendswith-sql столбец LIKE '%
'(без учета регистра) - старый: album__name__iendswith ='IBU'
- Новое: можно также написать
Track.album.name.iendswith('IBU')
- Точность-точное соответствие значению, столбец SQL =
- Вы можете использовать FilterGroups не только в filter() и except(), но и в:
- Получить ()
- Получить или нет ()
- Получить или создать ()
- Первый ()
- Все ()
- Удалить ()
- через FilterGroups (ormar.and_и ormar.or_) теперь вы можете использовать:
- & -как и_, а не как следующий слой.
- | - Вложение как "or_", а не как следующий уровень
- ~ -отрицание группы фильтров
-
Чтобы объединить несколько фильтров в набор условий, используйте & (sql AND) и| (SQL или)
1 2 3 4 5 6 7 8 9 10 11
# Following queries are equivalent: # sql: (product.name = 'Test' AND product.rating>= 3.0 ) # ormar Option 1 - OLD One Product.objects.filter(name ='Test', rating__gte =3.0).get() # ormar Option 2 - OLD One Product.objects.filter(ormar. and_(name ='Test', rating__gte =3.0)).get() # ormar Option 3 - New One (field Access) Product.objects.filter((Product.name == 'Test')& (Product.rating>=3.0)).get() -
То же самое относится к вложенным сложным фильтрующим
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# Following queries are equivalent: # sql: (product.name = 'Test' AND product.rating>= 3.0 ) # OR (categories.name IN ('Toys', 'Books')) # ormar Option 1 - OLD One Рекорд.((( ormar. and_(name ='Test', rating__gte =3.0), categories_name_in =['Toys', 'Books']) get() # ormar Option 2 - New One (instad of nested or use `|`) Карьера, рефрит ( ormar. and_(name ='Test', rating__gte =3.0)| ormar. and_(categories__name_in =['Toys', 'Books']) get() # ormar Option 3 - New One (field Access) Карьера, рефрит ( ((Product.name ='Test') & (Product.rating >= 3.0))| (Product.categories.name <['Toys', 'Books']) get() -
Теперь можно использовать доступ к полям для предоставления OrderActions для order_by ()
- В порядке возрастания:
- Старые:
Product.objects.order_by("name").all() - Новые:
Product.objects.order_by(Product.name.asc()).all()
- Старые:
- Порядок убывания:
- Старые:
Product.objects.order_by("-name").all() - Новые:
Product.objects.order_by(Product.name.desc()).all()
- Старые:
- Конечно, вы также можете комбинировать различные модели и множество ордеров_by:
Product.objects.order_by([Product.category.name.asc(), Product.name.desc()]).all()
- В порядке возрастания:
»Ремонт
- -это не ошибка, а несогласованность. Предоставляя фильтр с вложенными моделями, то есть album__category__name = 'AA', вы проверяете, включены ли модели альбомов и категорий в select_lated(), если нет, то автоматически добавьте их туда. Та же функция не доступна для FilterGroups (and_и or_), и теперь она работает (также для фильтров стилей Python, которые возвращают FilterGroups).
0.10.3
» Особенности
-
foreignKey и ManyToMany теперь поддерживают skip_reverse: bool = False флаг #118. Если вы установили флаг skip_reverse внутри, поле все еще регистрируется на другом конце отношения, так что вы можете:
- Фильтрация по соответствующим полям модели в обратной модели
- order_by Связанные поля модели в обратной модели
Но вы не можете:
- Использование related_name для доступа к соответствующим полям обратной модели
- Даже при выборе корреляции на обратной стороне модели возвращаемая модель не заполняется обратным экземпляром (соединения не блокируются, поэтому можно фильтровать и order_by)
- Связь не будет заполнена в Dict() и Json().
- не может передать вложенные связанные объекты при заполнении Dit () или json()(также через fastapi). В зависимости от дополнительных настроек конфигурации pydantic он будет игнорироваться или вызывать ошибки.
-
Model.save_lated () теперь может сохранять все дерево данных за один раз, что означает:
-
Она знает, следует ли сначала сохранить главную или связанную модель для сохранения связей.
-
Сохранить главную модель, если
- Не сохранилось,
- Нет значения pk
- Или save_all =True установлен флаг
В этих случаях вам не нужно разделять сохранение на два вызова (save() и save_lated ()).
-
Он также поддерживает отношения с большим количеством.
-
Он также поддерживает дополнительные значения модели через отношения m2m
-
Добавлена возможность адаптации с помощью имен полей связей модели.
-
По умолчанию имя связанной модели используется в строчном регистре. Таким образом, в следующем примере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
...# course declaration omitted Класссный студент (Ormar): Класс Meta: database = база данных metadata = metadata id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) Courses = ormar.ManyToMany(Course) # will produce default Through model like follows (example simplified) Class StudentCourse(модель): Класс Meta: database = база данных metadata = metadata tablename = "students_courses" id: int = ormar.Integer(primary_key =True) student = ormar.ForeignKey(Student) # default name course = ormar.ForeignKey(Course) # default name -
Чтобы настроить имя поля/связи в модели Through, теперь можно использовать новые параметры ManyToMany:
- Through_relation_name-имя поля, ведущего к модели, объявленной ManyToMany
- Through_reverse_relation_name-имя поля, ведущего к модели, к которой ведет ManyToMany
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
... # course declaration omitted Класссный студент (Ormar): Класс Meta: database = база данных metadata = metadata id: int = ormar.Integer(primary_key =True) name: str = ormar.String(max_length =100) Courses = ormar.ManyToMany(Course, Through_relation_name ="student_id", Through reverse_relation_name ="course_id") # will produce default Through model like follows (example simplified) Class StudentCourse(модель): Класс Meta: database = база данных metadata = metadata tablename = "students_courses" id: int = ormar.Integer(primary_key =True) student_id = ormar.ForeignKey(Student) # set by through relation_name course_id = ormar.ForeignKey(Course) # set by through reverse_relation_name
»Ремонт
- Исправление ошибки weakref ReferenceError #118
- Исправлена ошибка, вызванная Through fields при настройке pydantic Config.extra="forbid"
- Исправлена ошибка pydantic.PrivateAttr, которая не была инициализирована в__init__#149
- исправляет ошибку исключения pydantic-type из dict(), а ключ__all__не работает
»Прочее
- Ссылка на автоматический переводчик sqlchemy-to-ormar для модели
- Ссылка на библиотеку fastapi экосистемы, которая поддерживает ormar
- Добавление транзакций в документ (поддержка базы данных)
0.10.2
» Особенности
Model.save_related(follow=False)теперь имеет два дополнительных параметра:Model.save_related(follow=False, save_all=False, exclude=None).- save_all:bool -> По умолчанию (и, следовательно, save_all =False) ormar обновляет только вставленные несохраненные модели (следовательно, новые или обновленные модели). При использовании save_all =True все связанные модели сохраняются независимо от состояния сохранения. Это может быть полезно в тех случаях, когда обновленная модель поступает из вызова api и, следовательно, не изменяется в бэнде.
exclude: Union[Set, Dict, None]-> Настройки/Словари для исключения из сохранения связей, даже если используются Follow=True и save_all =True. Чтобы исключить вложенные связи, передайте вложенные словари, напримерexclude={"child":{"sub_child": {"exclude_sub_child_realtion"}}}. Допустимые значения следуют схеме fields/exclude_fields (из QuerySet), поэтому вы можете обратиться к документации в запросе-> Выберите подмножество полей-> поле. Метод* Model.update () теперь принимает параметр_columns: List[str] = None, который принимает список имен, которые требуется обновить. Если он будет принят, в базе данных будут обновлены только эти столбцы. Обратите внимание, что update() не обновляет экземпляр модели, поэтому если вы измените больше столбцов, чем в списке_columns, у экземпляра модели будет другое значение, чем у базы данных!
- Метод Model.model_dump () ранее содержал только непосредственно связанные или вложенные модели (если они не были пустыми и не виртуальными), теперь все связанные модели, которые ранее не были доступны без цикла, включаются в dict(). Это не должно быть повреждено, так как больше данных будет сброшено в словарь, но они не должны быть потеряны.
QuerySet.delete(each=False, **kwargs)Ранее вам было предложено передать фильтр (через**kwargs или отдельный вызов filter()) или each=True теперь также принимает вызов exclusive(), который создает фильтр NOT. Поэтому необходимо установить each=True, чтобы удалить всю таблицу или хотя бы один оператор фильтрации/исключения.- То же самое относится и к
QuerySet.update(each=False, **kwargs)Вам также предложили передать фильтр (через\**kwargs или отдельный вызов filter() или each=True теперь принимает вызов except(), который создает фильтр NOT. Таким образом, необходимо установить each=True для обновления всей таблицы или хотя бы одного предложения фильтрации/исключения. - То же самое относится и к
QuerysetProxy.update(each=False, **kwargs)Вам также предложили передать фильтр (через\**kwargs или отдельный вызов filter() или each=True теперь принимает вызов except(), который создает фильтр NOT. Таким образом, необходимо установить each=True для обновления всей таблицы или хотя бы одного предложения фильтрации/исключения.
»Ремонт
- Если столбец fk имеет другой псевдоним базы данных, исправляет неверное разрешение реляционных полей в QuerysetProxy.
- Исправлена рекурсивная ошибка очень сложной структуры модели с циклическими циклами при вызове dict().
- Исправлена ошибка, когда два нереляционных поля не являются зависимыми (JSON), объединяются (добавляются) в результат запроса
- Исправлена ошибка, когда одно и то же имя связи в цепочке при переводе из списка в словарь приводит к появлению разных моделей
- Исправлена ошибка bulk_create при попытке сохранить метод модификации property_field и поле pydantic
- Исправление ошибок слияния глубоко вложенных цепей с обратными связями
»Прочее
- Оптимизация производительности
- Разделение тестов на пакеты в зависимости от области тестирования
0.10.1
Характеристики
- добавляет метод get_or_none (**kwargs) в QuerySet и QuerysetProxy. Это точно то же самое, что и get(**kwargs), но если нет записей базы данных, соответствующих критериям, get_or\n one_не вызывает исключение ormar.NoMatch, а просто возвращает None.
Ремонт
- Исправлена ошибка, из-за которой ссылки на имена столбцов и таблиц, связанные с диалектами, в секции order_by не работают в postgres.
0.10.0
Разбить
- Удалена поддержка давно не рекомендованного представления определения поля, в котором поле ormar используется в качестве подсказки типа, а именно:
test_field: ormar.Integger() = None - улучшенные советы по типу-> mypy правильно разрешит связанные поля модели (ForeignKey и ManyToMany) и типы, возвращаемые методом QuerySet. Те, кто упомянул, теперь возвращают правильную модель (т. е. книгу) вместо типа ormar.Model. По-прежнему существуют проблемы с обратной стороной метода QuerysetProxy, чтобы облегчить подсказки типа, возвращаемые теперь Any. Частичное исправление #112.
Характеристики
- добавляет методы
select_all(follow: bool = False)QuerySet и QuerysetProxy. Он похож на метод load_all () для модели, но может быть использован непосредственно в запросе. По умолчанию select_all () добавляется только непосредственно связанная модель, а если Follow=True, то он добавляет связанные модели, но не создает циклического цикла отношений. Обратите внимание, что это не завершает асинхронные модели, поэтому вам все равно нужно отправлять get(), all() и т. д., так как select_all () возвращает QuerySet (или прокси), например fields() или order_by ().
Внутренняя структура
- Поле ormar больше не хранится как класс в словаре Meta.model_fields, а как экземпляр.
0.9.9
Характеристики
- Добавлена возможность изменения порядка отношений и моделей по умолчанию.
- Чтобы изменить порядок модели, передайте orders_by = [columns] where columns: List[str] в метакласс модели
- Чтобы изменить отношение_by, передайте order_by = [columns] where columns: List[str]
- для изменения обратных отношений order_by передать related_orders_by = [columns] where columns: List[str] Параметр* может быть именем столбца или-{col_name}Сортировать по убыванию
- В отношениях можно отсортировать только по непосредственно связанным столбцам модели, а для нескольких пар столбцов можно сортировать по столбцам модели
"{through_field_name}__{column_name}" - Предложение order_by применяется в следующем порядке:
- Выдача вызова order_by () в запросе явно
- Если есть, то связь с orders_by
- Метакласс модели orders_by
- Ключевой столбец модели asc (резервный, используется, если ни одно из вышеприведенных)
- Добавлены четыре новые агрегатные функции-> min, max, sum и avg, которые являются их соответствующими эквивалентами SQL.
- Можно передать одно или несколько имен столбцов, включая связанные столбцы.
- до сих пор каждый переданный столбец агрегирован отдельно (так что sum(col1+col2) невозможен, вы можете использовать sum(col1, col2), а затем добавить сумму 2 возвращенных в Python).
- Нельзя суммировать и усреднять значения нечисловых столбцов
- Если один столбец агрегирован, в результате возвращается одно значение
- Если вы агрегируете несколько столбцов, то возвращает словарь с парами column: Результаты
- добавляет 4 новых сигнала-> pre_relation_add, post_relation_add, pre_relation_remove и post_relation_remove Новый сигнал направлен на связь ManyToMany (обе стороны) и обратную сторону отношения foreignkey (то же, что и открытый QuerysetProxy). Сигнал получает следующие параметры: sender: Type[Model] -класс отправителя, instance: Model -добавить экземпляр связанной модели, child: Model -добавленная модель, relation_name: str -имя связи, добавляемой дочерним элементом, например, сигнал также передается через_kwargs: словари-словарь kwargs, передаваемый в add()
Изменения
- теперь может предоставлять не только автоматический инкрементный int в качестве первичного ключа, но и любой тип столбца с функцией по умолчанию путем создания, удаления и обновления модели многокомпонентного взаимодействия.
- Теперь, когда экземпляр модели был создан, можно подписаться на сигналы для сохранения/обновления/удаления до/после модели Through Ресивер сигнала* pre_update также получает параметр Passed_args, который представляет собой словарь значений, передаваемых функции обновления (если таковые имеются)(иначе это пустой словарь).
Ремонт
- Теперь перед извлечением значения отправляется сигнал pre_update, что позволяет изменять передаваемые экземпляры на месте, а измененные значения поля отражаются в базе данных.
- bulk_update теперь можно правильно использовать типы столбцов UID
0.9.8
Характеристики
- Добавлена возможность шифрования выбранных полей в базе данных
- По крайней мере, вам нужно предоставить encrypt_secret и encrypt_backend
- encrypt_backend может быть одним из перечислений ormar.EncryptBackends (NONE, FERNET, HASH, CUSTOM)-по умолчанию: NONE
- При выборе настраиваемого бэкэнда вам необходимо предоставить бэк-класс для подкласса ormar.fields.EncryptBackend
- Вы не можете зашифровать столбцы Primary_key и выключенные серии (FK и M2M).
- Доступны 2 серверных сервера: HASH и FERNET
- HASH-это односторонний хеш (например, пароль), который никогда не расшифруется при получении.
- FERNET-это двойной интерфейс шифрования/дешифрования
- Обратите внимание, что в бэкэнде FERNET возможность фильтрации полностью отсутствует, так как часть зашифрованного значения является временной меткой.
- Обратите внимание, что в бэнде HASH вы можете фильтровать по полному значению, но фильтры, такие как contains, не будут работать, потому что сравниваются значения шифрования.
- Обратите внимание, что добавление encrypt_backend приводит к изменению типа столбца базы данных на ТЕКСТ, который необходимо отразить в db путем миграции или изменения вручную.
Ремонт
- (расширенный/внутренний) восстанавливает неработающую функцию пользовательского типа sqlalchemy (через подкласс types.TypeDecorator), поэтому process_result_value никогда не вызывается
0.9.7
Характеристики
-
Добавляет оператор isnull для фильтрации и исключения методов.
1 2
album__name__isnull =True #(sql: album.name is null) album__name__isnull =False #(sql: album.name is not null) -
добавляет сложные запросы с вложенными условиями, которые можно использовать для комбинирования функций ormar.or_и ormar.and_. Пример запроса:
1 2 3 4 5 6 7 8 9 10
books = ( Book.objects.select ("author") Фильтр ( Аквал ( ormar.or_(year__gt =1960, year__lt =1940), author__name ="J. R. R. Tolkien", ) ) .all() )Проверьте запросы на обновления документов-> Фильтр и сортировка-> Сложные фильтры
Прочее
Установка* значений по умолчанию в ForeignKey или ManyToMany приводит к появлению исключения ModelDefinition, поскольку оно не поддерживается (и не поддерживалось)
0.9.6
важное
-
теперь является опциональным с помощью мульти-реляционной модели. Это не очень важно, потому что если вы предлагаете ее, все будет работать так же, как и раньше. Поэтому вы можете пропустить ее, если вы не хотите или не хотите "пройти" через какое-либо другое поле модели, вы можете пропустить ее. Обратите внимание, что она будет создана автоматически для вас и все еще должна быть включена в пример миграции alembic.
Обратите внимание на то, что если вы хотите настроить имя модели или таблицы базы данных, вам все равно потребуется предоставить его.
Характеристики
- добавляет обновления в QuerysetProxy, поэтому теперь вы можете обновлять связанные модели непосредственно из родительской модели в отношениях ManyToMany и из внешних внешних ключей. Обратите внимание, что обновления, такие как QuerySetupdate, указывают количество обновленных моделей и не обновляют связанные модели на родительской модели. Чтобы получить обновленные данные, необходимо обновить связанную модель (
await model_instance.related.all()). - добавляет метод модели
load_all(follow=False, exclude=None), который позволяет загружать текущий экземпляр модели и все связанные модели за один вызов. По умолчанию он загружает только модели, которые непосредственно связаны, но параметр follow=True приводит к пересечению дерева (избегая циклов). Вы также можете передать те же параметры исключения, что и метод QuerySet.exclude_fields (). - Добавлена возможность добавления дополнительных полей в модель с взаимоотношениями "Множественная пара":
- Имя поля модели-это имя класса Through в нижнем регистре.
- Вы можете передавать дополнительные поля при вызове add(child, **kwargs) в отношениях (на QuerysetProxy)
- Когда одним из параметров ключевого слова должно быть имя модели со словарем значений, можно передать дополнительные поля при вызове create(**kwargs) в отношениях (на QuerysetProxy)
- Вы можете заказать через поле модели.
- Фильтрацию можно выполнять по полям модели
- Можно включать и исключать поля из модели
- Through модель добавляется только к соответствующей модели (т. е. если вы запрашиваете из A в B-> только в B)
- Обратите внимание на то, что экспресс-модель загружается явно без связи-> Связь заполнена в поле ManyToMany.
- Обратите внимание, что, как ранее вы не могли объявить поля отношений через модель, они будут заполняться ormar для вас, но теперь, если вы попытаетесь сделать это, будет выброшена ошибка ModelDefinitionError
- Проверьте обновленный документ ManyToMany для получения дополнительной информации
Прочее
- Обновлены документы и документы API
- Реструктуризация и оптимизация в основном связаны с фильтрами, исключением и сортировкой
0.9.5
Ремонт
- Исправлена ошибка с созданием pydantic FieldInfo после обновления pydantic до версии>=1.8
- Закрепить требуемую версию, чтобы избежать подобных ситуаций в будущем
0.9.4
Ремонт
- Исправлено автоматическое создание режима fastapi OpenAPI для документов, когда несколько моделей ссылаются на одну и ту же связанную модель
0.9.3
Ремонт
- Исправлена ошибка, когда поля JSON задавались после инициализации
- Исправлена ошибка, из-за которой поля JSON не соответствовали настройкам пустых полей из-за внутренней структуры pydantic
- Восстановление проверки выбора полей JSON
- Восстановление непроверенных параметров при настройке свойств после инициализации
- Исправлены параметры, которые не были проверены во время вызова обновления QuerySet
0.9.2
Прочее
- Обновлено краткое начало работы в документе/файле readme
- Обновленный документ, содержащий ссылки на подстраницы запроса
- Добавлен значок с кодом климатического климата и количества загрузки
0.9.1
Характеристики
- Добавьте значения параметров в спецификацию OpenAPI, чтобы они выглядели как встроенные поля Enum в схеме результатов.
Ремонт
- Используйте fastapi, чтобы использовать режим выбора исправления, когда специальное поле не инициализировано, но передается как строка и т. д.
0.9.0
Важно.
Исправление тормозов* : версия 0.8.0 вводит ошибку, которая препятствует созданию зависимостей foreign_keys в базе данных, как в alembic, так и во время создания с помощью sqlalchemy.engine, которая теперь исправлена. * Таким образом, если вы используете версию>=0.8.0, настоятельно рекомендуется обновить ее, поскольку, хотя большинство функций ormar работают, база данных, созданная с помощью ormar (или ormar + alembic), не имеет значения и может быть затронута как с точки зрения производительности, так и данных. * Если вы подключаетесь к существующей базе данных с помощью ormar, ваша производительность и целостность должны быть хорошими, но вы должны обновить их, чтобы отразить все будущие обновления архитектуры в модели.
Разбить
- Прорыв: все внешние ключи и уникальные ограничения теперь имеют одно имя, поэтому alembic может идентифицировать их в базе данных, не полагаясь на базу данных. Разрушение* : Если метакласс модели не содержит метаданных или базы данных во время построения модели, то теперь генерируется ошибка ModelDefinitionError вместо универсальной AttributeError.
- разрушение: Кодировка/база данных для выполнения запросов не имеет пула соединений для серверной части sqlite, что означает, что каждый запрос выполняется с новым подключением, и обязательные ограничения внешних ключей не могут быть включены, так как эти ограничения по умолчанию отключены на каждом подключении. Это меняется в ormar начиная с>=0.9.0, и каждый запрос sqlite3 по умолчанию имеет "PRAGMAforeign_keys =1"; Запустите, так что теперь каждое соединение sqlite3 по умолчанию будет выполнять ограничения внешнего ключа, включая каскады.
Прочее
- Обновить документацию API.
- Добавление тестов для создания fk в базе данных и каскада в базе данных
0.8.1
Характеристики
- описывает обработку Forwardref в отношениях. Теперь вы можете создавать самоцитируемые модели-внешние ключи и многокомпонентные отношения. Forwardref доступен для to и throughModel.
-
Включите возможность соединения двух одинаковых связей в одном запросе для обработки сложных взаимосвязей, например:
1 2 3 4 5 6 7
B = X = Y // А \ C = X = Y = Before you could link from X to Y Once in one query Unless Two Different Relation Were Used (two Relation fields with different names) -
Добавлен метод разбивки страниц, позволяющий ограничивать/смещать по страницам и page_size. Доступно для QuerysetProxy и QuerysetProxy.
Прочее
- Рефакторинг и оптимизация производительности в запросах и соединениях.
- Добавляет Python 3.9 в тесты и настройки pypi.
- Обновление документации API и документации->, т. е. разделение документов запроса.
0.8.0
Разбить
Теперь родителю от нейтронного конца отношения Breaking:remove() необходимо передать имя связи, так как одна и та же модель может регистрироваться несколько раз, и ormar должен знать, из какой связи вы хотите удалить дочерний элемент. * Нарушение: по умолчанию использование select_lated для применения ограничений и смещений только к основной таблице перед подключением-> означает ограничение не общего числа, а только количества главной модели (первый в запросе, используемый для его построения). Вы все равно можете использовать флаг limit_raw_sql =True для ограничения или смещения (или обоих), чтобы ограничить все строки в ответе базы данных Разрушение : Отправка first() теперь получает первую строку, отсортированную по первичному ключу ASC (следовательно, первая строка вставляется (для нецифровых первичных ключей может отличаться-то есть алфавитный порядок строк)) Ошибка* : Отправка get() без фильтра теперь получает первую строку, отсортированную по первичному десу (следовательно, последняя вставленная строка может отличаться для нецифровых первичных ключей-то есть алфавитный порядок строк)) * Разрушение (внутренняя): столбец sqlalchemy, сохраненный в Meta.columns, больше не связан с таблицей, поэтому вы не можете получить их прямо из нее
Характеристики
- Введено наследование. В настоящее время возможны два типа наследования:
- Mixins -Не подстраивайте ormar.Model, просто определите поля, которые будут использоваться позже в различных моделях (например, created_date и updated_date в каждой подмодели), только таблицы создаются в реальной модели, но добавляются в mixins.
- наследование таблиц-означает, что родительский элемент помечен как abstract=True в метаклассе, и каждый дочерний элемент имеет свою собственную таблицу, содержащую столбцы от родительского и собственного дочернего столбца, немного напоминающего Mixins, но родительский родитель также представляет собой (абстрактную) модель.
- Для получения дополнительной информации ознакомьтесь с документацией по разделу Модель-> Наследование.
- QuerySet first() может использоваться с prefetch_lated
Ремонт
- Исправлена небольшая ошибка в order_by в командной строке основной модели
- Исправлено несколько related_names prefetch_query одной модели.
- Исправлена ошибка, из-за которой одни и те же связанные модели перезаписываются друг с другом при использовании одного и того же related_name на разных моделях, и теперь генерируется ModelDefinitionError, и вам нужно изменить имя.
- Исправлена ошибка при применении условия перезаписи order_by для нескольких соединений к одной таблице.
Документация
- Разделение и очистка в документе:
- Разделить часть модели на небольшие части
- Разделить раздел отношений на разделы
- Разделение полей на мелкие части
- Добавление наследственного компонента модели
- Добавление документации API (бета-версия)
0.7.5
- Исправлено неправильное имя столбца связей в Many_to_many (Исправлено #73)
0.7.4
- Разрешить несколько связей с одной и той же связанной моделью/таблицей.
- Исправлена ошибка, используемая в Many_to_many (Исправлено #73)
- Исправлена группа ошибочных связей m2m, когда в одной и той же модели существует связь fk.
- Если в одной и той же таблице в модели существует несколько связей, добавьте проверку, что пользователь предоставил related_name.
- более оперативно очищать мертвую модель слабых агентов.
0.7.3
- Исправлена ошибка с использованием параметра UUDI pk для получения связанной модели, который является исходной строкой (Исправлено #71)
0.7.2
- Исправлена проблема перезаписи связанных моделей только с помощью pk
Model.update() with fields passed as parameters(Исправлено #70)
0.7.1
- Исправлено: ошибка, когда перезаписывается связанная модель с помощью pk только на Model.save()(Исправление #68)
0.7.0
Ошибка* : метод QuerySetbulk_update теперь генерирует ModelPersistenceError для переданных несохраненных моделей вместо QueryDefinitionError * Прорыв: инициализация модели с неизвестным именем поля теперь генерирует ModelError вместо KeyError * добавляет сигналы с заранее заданными сигналами списка и декораторами: post_delete, post_save, post_update, pre_delete, pre_save, pre_update * Добавить py.typed и изменить setup.py для поддержки mypy * Оптимизация производительности * Обновить документ
0.6.2
- Оптимизация производительности
- Исправлена ошибка, требующая поля pydantic_only
- добавляет атрибут property_field, регистрируя функцию как свойство, которое будет содержаться в ответах Model.model_dump () и fastapi
- Обновить документ
0.6.1
- Явно установите None, чтобы исключить поля, которые могут быть пустыми, чтобы pydantic не задавала значения по умолчанию (Исправлено #60).
0.6.0
- Разрушение: вызов instance.load () при удалении строки экземпляра из базы данных теперь генерирует NoMatch вместо ValueError
- Разрушение: вызов добавления и удаления в отношениях ReverseForeignKey теперь обновляет настройки базы данных/удаляет подмодели в столбце fk
- : отношения ReverseignKey теперь доступны как ManyToMany.
- Разрушение: запрос связанной модели из ManyToMany удаляет список связанных моделей, загруженных в родительскую модель:
Пример* : post.categories.first () установит post.categories в список из 1 связанных моделей-> first() возвращаемые модели
- Пример 2: Если сообщение имеет 4 категории, то len(post.categories) == 4 вызов
post.categories.limit(2).all()-> Сейчас загружается только 2 подпроцессаassert len(post.categories) == 2
- Пример 2: Если сообщение имеет 4 категории, то len(post.categories) == 4 вызов
- добавляет get_or_create, update_or_create, fields, exclude_fields, exclusion, prefetch_lated и order_by в QuerySetProxy, так что теперь вы можете использовать эти методы непосредственно из отношений
- Обновить документ
0.5.5
- Исправлена проблема автоматического создания alembic для миграции столбцов UID. Он должен генерировать только sqlalchemy CHAR(32) или CHAR(36) Для работы* необходимо установить user_module_prefix ='sa'.(Это должно быть значение sqlalchemy_module_prefix (по умолчанию 'sa').)
0.5.4
-
позволяет передавать uuid_format (позволяет «шестнадцатеричный»(по умолчанию) или «Строки») в поле UUID для изменения формата сохранения. По умолчанию поля сохраняются в шестнадцатеричном формате (обрезание до 32 символов без тире), но можно передать format='string' для настройки существующей базы данных или другой базы с помощью 36 (с тире).
Образцы:
- Шестнадцатеричное значение = c616ab438cce49 dbf 4380d109251dce
- Строка = c616ab43-8 ccce-49 db-bf43-80d109251dce
0.5.3
- Исправлена ошибка метода Model.model_dump (), которая игнорирует исключаемые параметры и не содержит параметры словаря.
0.5.2
- Добавлен метод prefetch_lated для загрузки последующих моделей в отдельном запросе.
- Обновить документ
0.5.1
- Переключение на Github Actions вместо Travis
- Обновление значков в документе
0.5.0
- Добавлено состояние сохранения-> Вы можете проверить, была ли модель сохранена с помощью свойства ModelInstance.saved
- Сохранение модели после сохранения/обновления/загрузки/обновления метода вставки в модели
После сохранения модели* метод
create/get/first/all/get_or_create/update_or_create - Модель сохраняется при передаче в bulk_update и bulk_create
- Сохранение модели после добавления/удаления связанных объектов ManyToMany (автоматическое сохранение/удаление из экземпляра модели)
- Модель не сохраняется при изменении каких-либо собственных полей (включая pk в качестве псевдонима Model.pk)
- После добавления/удаления связанных объектов ForeignKey модель не сохраняется (столбец fk не сохранен)
- использует__init__Экземпляр без сохранения модели (без использования QuerySet.create или до вызова save)
- Сохранение модели после сохранения/обновления/загрузки/обновления метода вставки в модели
После сохранения модели* метод
- добавляет Model.upsert(**kwargs), а если pk не установлен, то выполняет save(), иначе update(**kwargs)
- Дополнительные
Model.save_related(follow=False)Итерация всех связанных объектов во всех отношениях и проверка их сохранения. Если нет, то вызов upsert() для каждого объекта. - Разрыв: при добавлении/удалении несохраненной модели (pk = None) к связи "Множественность к нескольким" добавляется исключение.
- Разрешить передачу словарей и коллекций в fields и except_fields
- Автоматический перевод str и списков в словари для полей и except_fields
- Нарушение: передача вложенных моделей в fields и excre_fields теперь осуществляется через имя соответствующего внешнего ключа, а не имя целевой модели.
- Оптимизация производительности-modelproxy, newbasemodel-Сокращение запросов>, некоторые свойства кэшируются на модели
- Удаление неиспользуемых кодов связей
- Добавить опциональную зависимость от производительности orjson (настоятельно рекомендуется)
- Обновить документ
0.4.4
- Добавление метода except_fields () для исключения полей из SQL
- Настройка имени столбца (псевдоним)
- Восстановление сортировки столбцов с псевдонимом
- Дополнительные тесты для fields и except_fields
- Обновить документ
0.4.3
- Содержит свойства в models.model_dump () и model.model_dump_json ()
0.4.2
- Изменение создания Pydantic модели, чтобы разрешить возврат связанной модели только с заполнением pk
0.4.1
- Добавление метода order_by в набор запросов, чтобы разрешить сортировку
- Обновить документ
0.4.0
- изменил символ в определении модели-> теперь использует name = ormar.Field() вместо name: ormar.Field()
- Обратите внимание, что старые представления по-прежнему поддерживаются, но устарели и не работают с статическими контрольными устройствами, такими как mypy и pydantic pycharm.
- Ввод документа запроса и проверка
- Также нельзя использовать Mypy для тестирования, можно использовать только пакет ormar.
- Исправлены преобразования масштаба и точности с помощью полей max_digits и decimal_places pydantic Decimal
- Обновление документа-Рекомендации по добавлению зависимостей
- Рефакторинг метаклассов и model_fields для лучшего использования подсказок типов
- Добавление плагинов mypy и pydantic в документацию
- Развертывание документа о взаимосвязях "Множественность"
0.3.11
- Исправлена установка сервера_default в поле Python по умолчанию
0.3.10
- Исправлена проверка postgresql, чтобы избежать исключений, когда драйвер не установлен при использовании другого серверного сервера
0.3.9
- Исправлено создание JSON с #19
- Исправлена проблема неинициализированных отношений ManyToMany в Fastapi копии ormar.Models
- Обновить документацию по использованию fastapi
- Добавить тест, чтобы проверить правильность генерации fastapi/docs
0.3.8
- Добавлена возможность переопределения имен столбцов базы данных с параметром имени для всех полей.
- Исправлена ошибка с помощью fields() для выбора связанных полей ManyToMany (если они пустые).
- Обновить документ
0.3.7
- Публикация документа и обновление файла readme
0.3.6
- Добавление метода fields() для ограничения выбранных столбцов в базе данных-исключение только тех столбцов, которые могут быть пустыми.
- Для создания уникальных зависимостей в списке столбцов к элементам модели добавлены UniqueColumns и список зависимостей.
- Добавлен тип поля UUID на основе типа столбца Char(32).
0.3.5
- Добавлены решения bulk_create и bulk_update для операций с несколькими объектами.
0.3.4
Добавление метода на уровне набора запросов
- Удалить
- Обновить
- Получить или создать
- Обновить или создать
0.3.3
- Добавить дополнительные фильтры-начало и конец
0.3.2
- Добавить параметр параметра во все поля: ограничение допустимых значений допустимыми значениями
0.3.1
- Добавлено исключение, чтобы отфильтровать условие «Where not ».
- Добавлены тесты для MySQL и postgres, а postgres исправлены.
- Рафисты и уборка.
0.3.0
- Добавлено поле ManyToMany и поддержка много-много-много-соотношений