Перейти к содержанию

Примечания к версии

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 = False dict(), что позволяет исключить все модели из отношений 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')
  • Вы можете использовать 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
  • добавляет 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 и поддержка много-много-много-соотношений