Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

`get_field_type` and `get_attribute_access_type` read `__fields__` and emit `PydanticDeprecatedSince20` on each field access

Open Beginner friendly
#7,561 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
72/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
python
Domain
backend

Research direction

The deprecated reads are in reflex_base/utils/types.py: the __fields__ accesses at lines 589-594 in get_field_type and line 710 in get_attribute_access_type. Start by running the reproduction script in the issue and checking the warning count. Done means the script reports 0 PydanticDeprecatedSince20 warnings and the field types resolve as before.

Written by the indexing model from the issue text.

Description

Describe the bug
Reflex reads cls.__fields__ when it resolves the type of a field on a Pydantic v2 model. Pydantic v2 deprecates __fields__, so each read emits PydanticDeprecatedSince20. One field access on a Var emits 7 warnings.

The reads are in reflex_base/utils/types.py (reflex-base 0.9.12):

  • get_attribute_access_type, line 710: 2 reads.
  • get_field_type, lines 589 to 594: 5 reads.

The same code is in 0.9.13 and 0.10.0. In 0.10.0, the lines are 580 to 585 and 701.

To Reproduce

import warnings

import pydantic
import reflex as rx


class Item(pydantic.BaseModel):
    name: str
    size: int


class ItemState(rx.State):
    items: list[Item] = []


with warnings.catch_warnings(record=True) as caught:
    warnings.simplefilter("always")
    rx.foreach(ItemState.items, lambda item: rx.text(item.name, " ", item.size))

deprecations = [record for record in caught if issubclass(record.category, pydantic.warnings.PydanticDeprecatedSince20)]
print(f"{len(deprecations)} PydanticDeprecatedSince20 warnings")
for warning in deprecations:
    print(f"  {warning.filename.split('site-packages/')[-1]}:{warning.lineno}")

Output with Python 3.14.6, reflex 0.9.12, reflex-base 0.9.12 and pydantic 2.14.0:

14 PydanticDeprecatedSince20 warnings
  reflex_base/utils/types.py:710
  reflex_base/utils/types.py:710
  reflex_base/utils/types.py:589
  reflex_base/utils/types.py:590
  reflex_base/utils/types.py:591
  reflex_base/utils/types.py:592
  reflex_base/utils/types.py:594
  (the same 7 lines again for the second field)

The script accesses 2 fields, and each access emits 7 warnings. In our app, one page compile does 176 field accesses and emits 1,232 warnings.

Expected behavior
Reflex resolves field types on Pydantic v2 models without deprecation warnings.

Specifics (please complete the following information):

  • Python Version: 3.14.6
  • Reflex Version: 0.9.12
  • OS: macOS 26.6.2 (build 25G83), on Apple Silicon (arm64)

Additional context
Related: #6241, #6135.

Dominant language
Python
Stars
28.9k
Forks
1.8k
Avg merge
2d 14h
Merged PRs (30d)
211

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from reflex-dev/reflex

All issues in reflex-dev/reflex

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.