Plugin Options¶
Options control how protoc-gen-pydantic generates Python output. They are passed via:
- buf:
opt:inbuf.gen.yaml - protoc:
--pydantic_opt=flag(s)
Summary¶
| Option | Default | Description |
|---|---|---|
preserving_proto_field_name |
true |
Use snake_case proto names instead of camelCase |
camel_case_alias |
true |
Add a camelCase JSON alias= to every field, independent of attribute casing |
auto_trim_enum_prefix |
true |
Remove enum type prefix from value names |
use_integers_for_enums |
false |
Use integer values instead of string names |
disable_field_description |
false |
Omit description= from field annotations |
use_none_union_syntax_instead_of_optional |
true |
Use T \| None instead of Optional[T] |
disable_validate |
false |
Omit all buf.validate constraints and CEL validators from generated models |
preserving_proto_field_name¶
Controls whether the Python attribute name uses the proto snake_case name or the camelCase
JSON name. This is independent of the wire/JSON name, which camel_case_alias
controls — see that option for how the two combine.
Default: true (snake_case attribute)
buf.gen.yaml:
protoc:
camel_case_alias¶
Adds alias="<camelCase JSON name>" to every field whose wire name would otherwise differ
from its Python attribute name, and enables populate_by_name=True on the message. This keeps
the Python attribute governed solely by preserving_proto_field_name while making the JSON/dict
wire format default to camelCase — the canonical proto3 JSON encoding used by most
cross-language protobuf tooling (grpc-gateway, Envoy, TypeScript/JS clients, etc).
Both spellings are always accepted on input regardless of this option's value: the Python
attribute name (via populate_by_name=True) and, when set, the alias.
Default: true (camelCase wire alias)
User(first_name="Ada") # Python attribute name — always works
User(**{"firstName": "Ada"}) # camelCase alias — only when camel_case_alias=true
# By default, serialization uses the alias:
User(first_name="Ada").model_dump() # {"firstName": "Ada"}
User(first_name="Ada").model_dump(by_alias=False) # {"first_name": "Ada"}
buf.gen.yaml:
protoc:
auto_trim_enum_prefix¶
Removes the enum type name prefix (case-insensitive, with trailing _) from value names.
Default: true (trim prefix)
buf.gen.yaml:
use_integers_for_enums¶
When enabled, enums use int as the mixin type and integer values instead of string names.
Default: false (string values)
buf.gen.yaml:
disable_field_description¶
When enabled, omits description= from generated _Field() calls even when the proto field
has a comment. The inline Python comment is still emitted.
Default: false (include descriptions)
buf.gen.yaml:
use_none_union_syntax_instead_of_optional¶
Controls how nullable types are expressed in annotations.
Default: true (T | None union syntax)
The
T | Nonesyntax requires Python 3.10+ for runtime evaluation. Generated files use string annotations ("T | None") so they are forward-compatible with Python 3.9.
buf.gen.yaml:
disable_validate¶
When enabled, all buf.validate constraints and CEL validators are omitted from the generated
output. The result is identical to what would be produced if the proto files had no
import "buf/validate/validate.proto" and no (buf.validate.field) or
(buf.validate.message) options.
Fields that would otherwise be required due to constraints (e.g., a string.email field with
no valid zero value) revert to their proto3 zero-value defaults ("", 0, false, etc.).
Default: false (include buf.validate constraints)
buf.gen.yaml:
protoc:
Combining options¶
Multiple options can be specified together: