Skip to content

fix(pandas-engine): respect optional pydantic fields in PydanticModel dtype - #2415

Open
Karthick-dev-cart wants to merge 2 commits into
unionai-oss:mainfrom
Karthick-dev-cart:bugfix/2406
Open

fix(pandas-engine): respect optional pydantic fields in PydanticModel dtype#2415
Karthick-dev-cart wants to merge 2 commits into
unionai-oss:mainfrom
Karthick-dev-cart:bugfix/2406

Conversation

@Karthick-dev-cart

Copy link
Copy Markdown

What

Fixes #2406: optional pydantic fields (e.g. Optional[int] = None) were rejected as non-nullable when validating a pandera.DataFrameModel whose Config.dtype = PydanticModel(...), even though the pydantic model itself allows the field to be missing or None.

Root cause

DataFrameSchema.__init__ auto-generates a pandera Column for each field of a PydanticModel dtype when no columns are explicitly declared (added in #2381). That auto-generation always built Column(None, name=name), and Column's default is nullable=False — so every auto-generated column was non-nullable regardless of whether the corresponding pydantic field was actually optional. This was a regression between 0.32.0 (working) and 0.32.1 (broken), introduced by #2381.

Fix

  • Added PydanticModel.column_nullability, which maps each column name (alias or field name, matching the existing column_names property) to whether the corresponding pydantic field is not required (checks FieldInfo.is_required() on Pydantic v2, ModelField.required on v1).
  • DataFrameSchema.__init__ now passes the matching nullable value when building each auto-generated column, instead of hardcoding False.

Testing

  • Reproduced both cases from the issue (rating column missing entirely, and present with all None values) against main — both raised SchemaError.
  • Confirmed the fix resolves both, and added them as regression tests (test_pydantic_model_optional_field_missing_column, test_pydantic_model_optional_field_null_values).
  • Added test_pydantic_model_required_field_still_rejects_nulls to confirm required fields are unaffected — nulls in a required field still correctly raise.
  • Ran the full existing suite for every test file that exercises PydanticModel (tests/pandas/test_pydantic_dtype.py, tests/pandas/test_pydantic.py, tests/pandas/test_model.py): all 123 tests pass.
  • ruff check clean on the changed files.

Notes

Scope is intentionally limited to the pandas backend / PydanticModel dtype path (the two files touched by #2381); the polars PydanticModel implementation is separate and unaffected.

… dtype

DataFrameSchema auto-generates a Column for each field of a PydanticModel
dtype when no columns are explicitly declared. These auto-generated
columns always defaulted to nullable=False, so optional pydantic fields
(e.g. `Optional[int] = None`) were rejected whenever the underlying data
contained nulls or the column was missing entirely, even though the
pydantic model itself allows this.

Add PydanticModel.column_nullability, which maps each column name (alias
or field name) to whether the corresponding pydantic field is required,
and use it when building the auto-generated columns so optional fields
are marked nullable.

Fixes unionai-oss#2406

Signed-off-by: Karthick <karthickd.tech@gmail.com>
@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.20%. Comparing base (b104d6f) to head (7de67b9).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2415      +/-   ##
==========================================
+ Coverage   90.93%   91.20%   +0.27%     
==========================================
  Files         192      192              
  Lines       17123    17129       +6     
==========================================
+ Hits        15570    15623      +53     
+ Misses       1553     1506      -47     
Flag Coverage Δ
unit-tests-base-Linux-py3.10 15.39% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Linux-py3.11 15.39% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Linux-py3.12 15.39% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Linux-py3.13 15.39% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Linux-py3.14 15.26% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Windows-py3.10 15.32% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Windows-py3.11 15.32% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Windows-py3.12 15.32% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Windows-py3.13 15.32% <37.50%> (+<0.01%) ⬆️
unit-tests-base-Windows-py3.14 15.19% <37.50%> (+<0.01%) ⬆️
unit-tests-base-macOS-py3.10 15.33% <37.50%> (+<0.01%) ⬆️
unit-tests-base-macOS-py3.11 15.33% <37.50%> (+<0.01%) ⬆️
unit-tests-base-macOS-py3.12 15.33% <37.50%> (+<0.01%) ⬆️
unit-tests-base-macOS-py3.13 15.33% <37.50%> (+<0.01%) ⬆️
unit-tests-base-macOS-py3.14 15.20% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Linux-py3.10-pandas2.3.3-polars 24.25% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Linux-py3.11-pandas2.3.3-polars 24.25% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Linux-py3.12-pandas2.3.3-polars 24.25% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Linux-py3.13-pandas2.3.3-polars 24.25% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Linux-py3.14-pandas2.3.3-polars 24.17% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Windows-py3.10-pandas2.3.3-polars 24.16% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Windows-py3.11-pandas2.3.3-polars 24.16% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Windows-py3.12-pandas2.3.3-polars 24.16% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Windows-py3.13-pandas2.3.3-polars 24.16% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-Windows-py3.14-pandas2.3.3-polars 24.08% <37.50%> (+<0.01%) ⬆️
unit-tests-dask-macOS-py3.10-pandas2.3.3-polars 24.19% <37.50%> (+<0.01%) ⬆️
unit-tests-fastapi-Linux-py3.10-pandas2.3.3-pydantic2.12.3 24.69% <37.50%> (-0.01%) ⬇️
unit-tests-fastapi-Linux-py3.11-pandas2.3.3-pydantic2.12.3 24.69% <37.50%> (+0.01%) ⬆️
unit-tests-fastapi-Linux-py3.11-pandas3.0.0-pydantic2.12.3 24.76% <37.50%> (+<0.01%) ⬆️
unit-tests-fastapi-Linux-py3.13-pandas2.3.3-pydantic2.12.3 24.69% <37.50%> (+0.01%) ⬆️
unit-tests-fastapi-Linux-py3.13-pandas3.0.0-pydantic2.12.3 24.76% <37.50%> (+0.01%) ⬆️
unit-tests-fastapi-Linux-py3.14-pandas2.3.3-pydantic2.12.3 24.60% <37.50%> (+0.01%) ⬆️
unit-tests-geopandas-Linux-py3.10-pandas2.3.3-pydantic2.12.3 30.07% <37.50%> (-0.01%) ⬇️
unit-tests-geopandas-Linux-py3.11-pandas3.0.0-pydantic2.12.3 30.07% <37.50%> (+<0.01%) ⬆️
unit-tests-geopandas-Linux-py3.12-pandas3.0.0-pydantic2.12.3 30.07% <37.50%> (+0.01%) ⬆️
unit-tests-geopandas-Linux-py3.13-pandas2.3.3-pydantic2.12.3 30.07% <37.50%> (-0.01%) ⬇️
unit-tests-geopandas-Linux-py3.13-pandas3.0.0-pydantic2.12.3 30.07% <37.50%> (-0.01%) ⬇️
unit-tests-hypotheses-Linux-py3.10-pandas2.3.3-pydantic2.12.3 22.50% <37.50%> (+0.03%) ⬆️
unit-tests-hypotheses-Linux-py3.11-pandas2.3.3-pydantic2.12.3 22.50% <37.50%> (+<0.01%) ⬆️
unit-tests-hypotheses-Linux-py3.12-pandas3.0.0-pydantic2.12.3 22.53% <37.50%> (+0.01%) ⬆️
unit-tests-hypotheses-Linux-py3.14-pandas3.0.0-pydantic2.12.3 22.43% <37.50%> (+<0.01%) ⬆️
unit-tests-hypotheses-Windows-py3.10-pandas2.3.3-pydantic2.12.3 22.42% <37.50%> (+0.01%) ⬆️
unit-tests-hypotheses-Windows-py3.11-pandas2.3.3-pydantic2.12.3 22.42% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Linux-py3.10-pandas2.3.3-polars 28.85% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Linux-py3.11-pandas2.3.3-polars 28.85% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Linux-py3.12-pandas2.3.3-polars 28.85% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Linux-py3.13-pandas2.3.3-polars 28.85% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Linux-py3.14-pandas2.3.3-polars 28.66% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Windows-py3.10-pandas2.3.3-polars 28.77% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Windows-py3.11-pandas2.3.3-polars 28.77% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Windows-py3.12-pandas2.3.3-polars 28.77% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Windows-py3.13-pandas2.3.3-polars 28.77% <37.50%> (+<0.01%) ⬆️
unit-tests-ibis-Windows-py3.14-pandas2.3.3-polars 28.59% <37.50%> (+<0.01%) ⬆️
unit-tests-io-Linux-py3.11-pandas3.0.0-pydantic2.12.3 38.10% <37.50%> (-0.01%) ⬇️
unit-tests-io-Linux-py3.12-pandas3.0.0-pydantic2.12.3 38.10% <37.50%> (-0.01%) ⬇️
unit-tests-io-Linux-py3.13-pandas2.3.3-pydantic2.12.3 38.13% <37.50%> (-0.01%) ⬇️
unit-tests-io-Linux-py3.14-pandas2.3.3-pydantic2.12.3 38.02% <37.50%> (+<0.01%) ⬆️
unit-tests-io-Windows-py3.10-pandas2.3.3-pydantic2.12.3 37.73% <37.50%> (-0.01%) ⬇️
unit-tests-io-Windows-py3.11-pandas3.0.0-pydantic2.12.3 37.74% <37.50%> (-0.02%) ⬇️
unit-tests-modin-dask-Linux-py3.10-pandas2.3.3-polars 30.69% <37.50%> (+<0.01%) ⬆️
unit-tests-modin-dask-Linux-py3.11-pandas2.3.3-polars 30.69% <37.50%> (-0.01%) ⬇️
unit-tests-modin-ray-Linux-py3.10-pandas2.3.3-polars 30.67% <37.50%> (+<0.01%) ⬆️
unit-tests-modin-ray-Linux-py3.11-pandas2.3.3-polars 30.67% <37.50%> (+<0.01%) ⬆️
unit-tests-modin-ray-Linux-py3.12-pandas2.3.3-polars 30.67% <37.50%> (+<0.01%) ⬆️
unit-tests-mypy-Linux-py3.12-pandas3.0.0-pydantic2.12.3 23.52% <37.50%> (+0.05%) ⬆️
unit-tests-narwhals-Linux-py3.10 28.26% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-Linux-py3.11 28.26% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-Linux-py3.12 28.26% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-Linux-py3.13 28.26% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-Linux-py3.14 28.03% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-ibis-py3.10 31.80% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-ibis-py3.11 31.69% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-ibis-py3.12 31.69% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-ibis-py3.13 31.69% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-ibis-py3.14 31.48% <37.50%> (+<0.01%) ⬆️
unit-tests-narwhals-backend-polars-py3.10 34.43% <37.50%> (-0.01%) ⬇️
unit-tests-narwhals-backend-polars-py3.11 34.42% <37.50%> (-0.01%) ⬇️
unit-tests-narwhals-backend-polars-py3.12 34.42% <37.50%> (-0.01%) ⬇️
unit-tests-narwhals-backend-polars-py3.13 34.42% <37.50%> (-0.01%) ⬇️
unit-tests-narwhals-backend-polars-py3.14 34.28% <37.50%> (-0.01%) ⬇️
unit-tests-narwhals-backend-pyspark-py3.10 43.47% <37.50%> (?)
unit-tests-narwhals-backend-pyspark-py3.11 43.50% <37.50%> (?)
unit-tests-pandas-Linux-py3.10-pandas2.3.3-pydantic1.10.11 42.80% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.10-pandas2.3.3-pydantic2.12.3 42.96% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.11-pandas2.3.3-pydantic1.10.11 42.80% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.11-pandas2.3.3-pydantic2.12.3 42.96% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.11-pandas3.0.0-pydantic2.12.3 42.97% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.12-pandas2.3.3-pydantic1.10.11 42.79% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.12-pandas2.3.3-pydantic2.12.3 42.95% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.12-pandas3.0.0-pydantic2.12.3 42.96% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.13-pandas2.3.3-pydantic1.10.11 42.79% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.13-pandas2.3.3-pydantic2.12.3 42.95% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.13-pandas3.0.0-pydantic2.12.3 42.96% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.14-pandas2.3.3-pydantic2.12.3 42.93% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Linux-py3.14-pandas3.0.0-pydantic2.12.3 42.94% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.10-pandas2.3.3-pydantic1.10.11 42.72% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.10-pandas2.3.3-pydantic2.12.3 42.87% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.11-pandas2.3.3-pydantic1.10.11 42.72% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.11-pandas2.3.3-pydantic2.12.3 42.87% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.11-pandas3.0.0-pydantic2.12.3 42.89% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.12-pandas2.3.3-pydantic1.10.11 42.70% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.12-pandas2.3.3-pydantic2.12.3 42.86% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.12-pandas3.0.0-pydantic2.12.3 42.87% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.13-pandas2.3.3-pydantic1.10.11 42.70% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.13-pandas2.3.3-pydantic2.12.3 42.86% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.13-pandas3.0.0-pydantic2.12.3 42.87% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.14-pandas2.3.3-pydantic2.12.3 42.84% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-Windows-py3.14-pandas3.0.0-pydantic2.12.3 42.86% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.10-pandas2.3.3-pydantic1.10.11 42.74% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.10-pandas2.3.3-pydantic2.12.3 42.90% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.11-pandas2.3.3-pydantic1.10.11 42.74% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.11-pandas2.3.3-pydantic2.12.3 42.90% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.11-pandas3.0.0-pydantic2.12.3 42.91% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.12-pandas2.3.3-pydantic1.10.11 42.73% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.12-pandas2.3.3-pydantic2.12.3 42.89% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.12-pandas3.0.0-pydantic2.12.3 42.90% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.13-pandas2.3.3-pydantic1.10.11 42.73% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.13-pandas2.3.3-pydantic2.12.3 42.89% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.13-pandas3.0.0-pydantic2.12.3 42.90% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.14-pandas2.3.3-pydantic2.12.3 42.87% <87.50%> (+0.01%) ⬆️
unit-tests-pandas-macOS-py3.14-pandas3.0.0-pydantic2.12.3 42.88% <87.50%> (+0.01%) ⬆️
unit-tests-polars-Linux-py3.10-pandas2.3.3-polars1.33.1 31.03% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Linux-py3.11-pandas2.3.3-polars1.33.1 31.02% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Linux-py3.12-pandas2.3.3-polars1.33.1 31.02% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Linux-py3.13-pandas2.3.3-polars1.33.1 31.02% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Linux-py3.14-pandas2.3.3-polars1.33.1 30.89% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Windows-py3.10-pandas2.3.3-polars1.33.1 30.95% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Windows-py3.11-pandas2.3.3-polars1.33.1 30.94% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Windows-py3.12-pandas2.3.3-polars1.33.1 30.94% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Windows-py3.13-pandas2.3.3-polars1.33.1 30.94% <37.50%> (+<0.01%) ⬆️
unit-tests-polars-Windows-py3.14-pandas2.3.3-polars1.33.1 30.82% <37.50%> (+<0.01%) ⬆️
unit-tests-pyspark-Linux-py3.10-pandas2.3.3-polars 39.00% <37.50%> (?)
unit-tests-pyspark-Linux-py3.11-pandas2.3.3-polars 39.00% <37.50%> (?)
unit-tests-strategies-Linux-py3.10-pandas2.3.3-pydantic2.12.3 34.17% <37.50%> (+<0.01%) ⬆️
unit-tests-strategies-Linux-py3.11-pandas2.3.3-pydantic2.12.3 34.17% <37.50%> (+<0.01%) ⬆️
unit-tests-strategies-Linux-py3.11-pandas3.0.0-pydantic2.12.3 34.17% <37.50%> (-0.01%) ⬇️
unit-tests-strategies-Linux-py3.12-pandas3.0.0-pydantic2.12.3 34.17% <37.50%> (-0.01%) ⬇️
unit-tests-strategies-Linux-py3.14-pandas2.3.3-pydantic2.12.3 34.12% <37.50%> (+<0.01%) ⬆️
unit-tests-strategies-Linux-py3.14-pandas3.0.0-pydantic2.12.3 34.11% <37.50%> (-0.01%) ⬇️
unit-tests-strategies-Windows-py3.10-pandas2.3.3-pydantic2.12.3 34.09% <37.50%> (-0.01%) ⬇️
unit-tests-xarray-Linux-py3.10-pandas2.3.3-polars 31.75% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Linux-py3.11-pandas2.3.3-polars 31.75% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Linux-py3.12-pandas2.3.3-polars 31.75% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Linux-py3.13-pandas2.3.3-polars 31.75% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Linux-py3.14-pandas2.3.3-polars 31.68% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Windows-py3.10-pandas2.3.3-polars 31.68% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Windows-py3.11-pandas2.3.3-polars 31.68% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Windows-py3.12-pandas2.3.3-polars 31.68% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Windows-py3.13-pandas2.3.3-polars 31.68% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-Windows-py3.14-pandas2.3.3-polars 31.61% <37.50%> (+<0.01%) ⬆️
unit-tests-xarray-macOS-py3.10-pandas2.3.3-polars 31.69% <37.50%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

… assertion

The end-to-end null-rejection test failed under pydantic 1.10.11 in CI
(python 3.11-3.13, all OSes): pydantic v1's `str` validator coerces a
non-string input like float('nan') into the string 'nan' instead of
rejecting it, so a null title never reaches PydanticModel.coerce()'s
ValidationError handling on v1. Confirmed this is pydantic v1's own
coercion behavior, not a bug in column_nullability - the nullable flag
on the auto-generated Column is correct on both versions.

Added a version-agnostic test asserting the nullable flag directly, and
skipped the end-to-end rejection test on pydantic v1 with the reason
above.

Signed-off-by: Karthick <karthickd.tech@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optional fields now required in dataframe when using PydanticModel

1 participant