Skip to content

Enum default=0 is not converted to enum member with --set-default-enum-member #2976

@kkinugasa

Description

@kkinugasa

Describe the bug
When using --set-default-enum-member, an IntEnum field default value 0 is not converted to the corresponding enum member (e.g. Status.integer_0). The generated model keeps the numeric default (0) instead of Status.integer_0.

To Reproduce

Example schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "status": {
      "$ref": "#/$defs/Status",
      "default": 0
    }
  },
  "$defs": {
    "Status": {
      "type": "integer",
      "enum": [0, 1]
    }
  }
}

Used commandline:

$ datamodel-codegen --input test.json --set-default-enum-member

Output:

from __future__ import annotations

from enum import IntEnum

from pydantic import BaseModel


class Status(IntEnum):
    integer_0 = 0
    integer_1 = 1


class Model(BaseModel):
    status: Status | None = 0

Expected behavior
The default value should be converted to the corresponding enum member when --set-default-enum-member is enabled.

class Model(BaseModel):
    status: Status | None = Status.integer_0

Version:

  • OS: macOS
  • Python version: 3.13.11
  • datamodel-code-generator version: 0.53.1

Additional context
Confirmed locally: the issue is fixed for this case by applying the following changes.

In

:

- if not model_field.default:
+ if model_field.default is None:

In

field_default = str(field.default or "").strip("'\"")
:

- field_default = str(field.default or "").strip("'\"")
+ field_default = str("" if field.default is None else field.default).strip("'\"")

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinggood first issueGood for newcomers

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions