PydanticUndefinedAnnotation bei Verwendung von SQLModel mit Typanmerkungen

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: PydanticUndefinedAnnotation bei Verwendung von SQLModel mit Typanmerkungen

by Guest » 17 Jan 2025, 10:13

Ich verwende SQLModel für ein Projekt. Aber ich bin auf ein Problem mit Typanmerkungen gestoßen.

Code: Select all

# 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

Code: Select all

# 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

In der Kategorie.py in dieser Zeile blogs: list["BlogPublicGeneric"] = [] erhalte ich diese Fehlermeldung. PydanticUndefinedAnnotation: Name „BlogPublicGeneric“ ist nicht definiert. Der interessantere Teil ist, dass es ohne Fehler funktioniert, wenn ich einfach „BlogPublic“ anstelle von „BlogPublicGeneric“ importiere und verwende. Aber wie Sie in blog.py sehen können, ist „BlogPublicGeneric“ eigentlich ein einfacheres Modell. Ich verstehe nicht, warum dies einen Fehler verursacht. Wir freuen uns über jede Hilfe.
Ich habe es mit verschiedenen Klassen ausprobiert. Ich habe versucht, TYPE_CHECKING loszuwerden, aber das ist derzeit aufgrund eines zirkulären Importproblems nicht möglich.

Top