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.
Ich verwende SQLModel für ein Projekt. Aber ich bin auf ein Problem mit Typanmerkungen gestoßen.
[code]# 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]
[code]# 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
[/code]
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.