### First Check - [X] I added a very descriptive title to this issue. - [X] I used the GitHub search to find a similar issue and didn't find it. - [X] I searched the SQLModel documentation, with the integrated search. - [X] I already searched in Google "How to X in SQLModel" and didn't find any information. - [X] I already read and followed all the tutorial in the docs and didn't find an answer. - [X] I already checked if it is not related to SQLModel but to [Pydantic](https://github.com/samuelcolvin/pydantic). - [X] I already checked if it is not related to SQLModel but to [SQLAlchemy](https://github.com/sqlalchemy/sqlalchemy). ### Commit to Help - [ ] I commit to help with one of those options 👆 ### Example Code ```python from typing import Literal, Union, Optional from sqlmodel import SQLModel, Field class Bar(SQLModel): class_type: Literal["bar"] = "bar" name: str class Foo(SQLModel): class_type: Literal["foo"] = "foo" name: str id: Optional[int] class FooBar(SQLModel, table=True): id: int = Field(default=None, primary_key=True) data: Union[Foo, Bar] = Field(discriminator="class_type") ``` ### Description * No support for Pydantic 1.9's implementation of discriminated union ### Wanted Solution Would like to have support for discriminated union in SQLModel-classes ### Wanted Code ```python from typing import Literal, Union, Optional from sqlmodel import SQLModel, Field class Bar(SQLModel): class_type: Literal["bar"] = "bar" name: str class Foo(SQLModel): class_type: Literal["foo"] = "foo" name: str id: Optional[int] class FooBar(SQLModel, table=True): id: int = Field(default=None, primary_key=True) data: Union[Foo, Bar] = Field(discriminator="class_type") ``` ### Alternatives _No response_ ### Operating System Linux ### Operating System Details _No response_ ### SQLModel Version 0.0.6 ### Python Version 3.10.4 ### Additional Context Pydantic has added support for discrimated unions, something I use in my project with Pydantic + SQLAlchemy. I want to switch to SQLModel, but cannot switch before discriminated unions
Activity
ljluestc commentedon Sep 3, 2023
from sqlmodel import SQLModel, Field, Relationship
from typing import Optional
class Base(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
class_type: str
class Bar(Base):
mapper_args = {"polymorphic_identity": "bar"}
name: str
class Foo(Base):
mapper_args = {"polymorphic_identity": "foo"}
name: str
class FooBar(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
data: Relationship[Base] = Field(discriminator="class_type")
Create instances of Bar and Foo
bar_instance = Bar(name="My Bar")
foo_instance = Foo(name="My Foo")
Create instance of FooBar with either a Bar or Foo instance
foobar_instance = FooBar(data=bar_instance) # Or Foo instance
print(bar_instance)
print(foo_instance)
print(foobar_instance)
tiangolo commentedon Oct 26, 2023
Support for this was added in #440
You will be able to use it in the next version:
0.0.10🎉github-actions commentedon Nov 6, 2023
Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs.
stuartaxonHO commentedon Dec 4, 2025
YuriiMotov commentedon Dec 4, 2025
stuartaxonHO commentedon Dec 4, 2025
stuartaxonHO commentedon Dec 4, 2025