Repository navigation
Convert all fields to optional #64
Description
Activity
This is pydantic-related. You can make optional fields required in child classes, but you cannot make required fields optional.
Maybe the following resources will help you:
- Change default value of inherited attribute using Field pydantic/pydantic#1141 (comment)
- https://stackoverflow.com/a/65907609/3778854
You can use a pattern like this instead:
class HeroBase(SQLModel): # optional, aka nullable name: Optional[str] secret_name: Optional[str] age: Optional[int] class HeroCreate(HeroBase): # all required name: str secret_name: str age: int class HeroUpdate(HeroBase): pass
Reacted by 243f6a88 85a308d3Reacted by Yue JIN, Cameron Potter and W. VallejoYou can make optional fields required in child classes, but you cannot make required fields optional.
Perhaps this is not possible with
class, however I think it is possible withtype()?In #166 I link to a proposed method,
make_updater_cls, that does this.I am new to Pydantic + SQLModel so certainly welcome any feedback on this approach.
Edit: Upon closer consideration, I realize that my proposed method does not allow for making required fields optional on a class which inherits from the user-defined base model. Rather, a new class (which inherits directly from
SQLModel) is created using the user-defined base model as reference. So the more general point about Python inheritance (child classes can't "optionalize" fields) is not disproved, but perhaps the practical application (how to generate an updater model from a base model) may still be possible.I really find interesting the idea of creating a schema that inherits all fields from a
SQLModelbut make all of them Optional. Did you ever find a solution to this, @cisaacstern or @nickleman?Reacted by Yurii Motov and Grzegorz LimanówkaAlso - it would be cool to have better control of which field should be optional and which not.
I was thinking about some kind of "decorator" mechanism to generate desired new class similar to this:
@Partial class Hero(SQLModel): id: int @option name: str @option secret_name: str @remove age: Optional[int] = None
Above code should generate 2 classes, first one with name
Heroand the second one, like this:class HeroPartial(SQLModel): id: int name: Optional[str] secret_name: Optional[str]
@FilipeMarch apologies, I somehow missed your ping initially, and now a huge amount of time has passed. I have not thought about this issue in a while, but yes, the solution for a make_updater_cls method, proposed in my comment above, did work for me at the time.
- added a commit that references this issue
on Mar 25, 2026 - locked and limited conversation to collaborators
on May 18, 2026
First Check
Commit to Help
Example Code
Description
Is it possible to add the ability to modify the fields of a base class to convert them to all optional with a parameter like the table=True but in this case all_optional=True? This would help eliminate the duplication when creating a class for making updates.
Wanted Solution
Set all base fields to Optional based on keyword argument.
Wanted Code
Alternatives
No response
Operating System
Linux, Windows
Operating System Details
No response
SQLModel Version
0.0.4
Python Version
3.8.5
Additional Context
No response