Параметр by_alias в model_dump() игнорируется

В следующем коде мы видим, что поле id действительно создается с псевдонимом user_id, когда мы печатаем model_fields.

Однако, когда я затем вызываю model_dump(alias=True), возвращенный dict имеет ключ id, но не имеет ключа user_id, как я ожидаю.

Это ошибка или я что-то упускаю?

Возможно, это связано с alias_priority=2, но, похоже, это не параметр в Field SQLModel, а только в Pydantic.

from uuid import UUID, uuid4

from sqlmodel import Field, SQLModel


class Temp(SQLModel, table=True):
    id: UUID = Field(default_factory=uuid4, primary_key=True, alias = "user_id")


t = Temp()

print(t.model_fields)
print(t.model_dump(by_alias=True))

Результат:

{'id': FieldInfo(annotation=UUID, required=False, default_factory=uuid4, alias='user_id', alias_priority=2)}
{'id': UUID('1c8db668-be5c-4942-b494-ef69cbc0ef3a')}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

какую версию SQLModel вы используете?

Кажется, псевдоним не работает с версии 0.0.14.

https://github.com/tiangolo/sqlmodel/discussions/725

Вау, спасибо! А версия 0.0.14 — это когда они обновились до Pydantic v2, поэтому переход на версию 0.0.13 — это большое изменение.

KOB 14.03.2024 12:44

Как отметил @linpingta, параметр by_alias больше не работает из-за ошибки в SQLModel.

В качестве исправления я расширил класс SQLModel, переопределив метод model_dump():

from sqlmodel import SQLModel as SQLModelBase


class SQLModel(SQLModelBase):
    def model_dump(self, *args, **kwargs) -> dict[str, Any]:
        model_dump = super().model_dump(*args, **kwargs)

        if kwargs.get("by_alias") is False:
            return model_dump

        for field_name, field_info in self.__fields__.items():
            if field_info.alias:
                model_dump[field_info.alias] = model_dump.pop(field_name)

        return model_dump

Другие вопросы по теме