PydanticUndefineAnnotation при использовании SQLModel с аннотациями типовPython

Программы на Python
Ответить
Anonymous
 PydanticUndefineAnnotation при использовании SQLModel с аннотациями типов

Сообщение Anonymous »

Я использую SQLModel для проекта. Но я столкнулся с проблемой с аннотациями типов.

Код: Выделить всё

# blog.py
from __future__ import annotations
from sqlmodel import Field, SQLModel, Relationship
from .defaults import UUIDModel, TimestampModel
from app.api.database.models.blogItem import BlogItem
from app.api.database.models.image import Image, ImagePublic
from app.api.database.models.blogImage import BlogImage
from app.api.database.models.section import Section, SectionPublic
from app.api.database.models.tag import Tag, TagPublic
from app.api.database.models.blogTag import BlogTag
from app.api.database.models.metaTag import MetaTag, MetaTagPublic
from app.api.database.models.blogMetaTag import BlogMetaTag
from app.api.database.models.item import Item, ItemPublic
from app.api.database.models.category import Category, CategoryPublic

from uuid import UUID

class BlogBase(SQLModel):
title: str = Field(index=True)
author: str = Field(index=True)
description: str
read_time: int

class Blog(TimestampModel, BlogBase, UUIDModel, table=True):
category_id: UUID = Field(foreign_key="category.id", index=True, default=None)
items: list["Item"] = Relationship(
back_populates="blogs",
link_model=BlogItem,
sa_relationship_kwargs={"lazy": "selectin"},
)
images: list["Image"] = Relationship(
back_populates="blogs",
link_model=BlogImage,
sa_relationship_kwargs={"lazy": "selectin"},
)
sections: list["Section"] = Relationship(
back_populates="blog",
sa_relationship_kwargs={"lazy": "selectin"},
)
tags: list["Tag"] = Relationship(
back_populates="blogs",
link_model=BlogTag,
sa_relationship_kwargs={"lazy": "selectin"},
)
meta_tags: list["MetaTag"] = Relationship(
back_populates="blogs",
link_model=BlogMetaTag,
sa_relationship_kwargs={"lazy": "selectin"},
)
category: "Category" = Relationship(
back_populates="blogs",
sa_relationship_kwargs={"lazy": "selectin"},
)

class BlogCreate(BlogBase):
related_item_ids: list[UUID]
image_ids: list[UUID]
tag_ids: list[UUID]
meta_tag_ids: list[UUID]
category_id: UUID | None = None

class BlogPublic(TimestampModel, BlogBase, UUIDModel):
items: list[ItemPublic] | None = None
images: list["ImagePublic"] = []
sections: list["SectionPublic"] = []
tags: list["TagPublic"] = []
meta_tags: list["MetaTagPublic"] = []
category: "CategoryPublic | None" = None

class BlogPublicGeneric(TimestampModel, BlogBase, UUIDModel):
pass

class BlogUpdate(BlogCreate):
pass

Код: Выделить всё

# category.py
from __future__ import annotations
from sqlmodel import Field, SQLModel, Relationship
from .defaults import UUIDModel, TimestampModel
from typing import TYPE_CHECKING, Optional, List

if TYPE_CHECKING:
from app.api.database.models.item import Item, ItemPublicGeneric
from app.api.database.models.blog import Blog, BlogPublicGeneric

class CategoryBase(SQLModel):
name: str

class Category(TimestampModel, CategoryBase, UUIDModel, table=True):
items: list["Item"] = Relationship(
back_populates="category",
sa_relationship_kwargs={"lazy": "joined"},
)
blogs: list["Blog"] = Relationship(
back_populates="category",
sa_relationship_kwargs={"lazy": "joined"},
)

class CategoryCreate(CategoryBase):
pass

class CategoryPublic(TimestampModel, CategoryBase, UUIDModel):
items: list["ItemPublicGeneric"] = []
blogs: list["BlogPublicGeneric"] = []

class CategoryPublicGeneric(TimestampModel, CategoryBase, UUIDModel):
pass

class CategoryUpdate(CategoryBase):
pass

В категории.py в этой строке blogs: list["BlogPublicGeneric"] = [] я получаю эту ошибку. PydanticUndefineAnnotation: имя «BlogPublicGeneric» не определено. Более интересная часть: если я просто импортирую и использую «BlogPublic» вместо «BlogPublicGeneric», это работает без ошибок. Но, как вы можете видеть в blog.py, «BlogPublicGeneric» на самом деле является более простой моделью. Я не понимаю, почему это вызывает ошибку. Любая помощь приветствуется.
Я пробовал это с разными классами. Я пытался избавиться от TYPE_CHECKING, но в настоящее время это невозможно из-за проблемы циклического импорта.

Подробнее здесь: https://stackoverflow.com/questions/793 ... nnotations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»