BeanieODM / beanie

Asynchronous Python ODM for MongoDB

Home Page:http://beanie-odm.dev/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG] Argument of type `Callable` to `json_schema_extra` raises `AttributeError`

valentinoli opened this issue · comments

Describe the bug
When I pass a Callable to the json_schema_extra argument of pydantic.Field(), I get the following error:

  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/init.py", line 754, in init_beanie
    await Initializer(
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/init.py", line 129, in __await__
    yield from self.init_class(model).__await__()
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/init.py", line 717, in init_class
    await self.init_document(cls)
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/init.py", line 573, in init_document
    self.init_document_fields(cls)
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/init.py", line 385, in init_document_fields
    cls.check_hidden_fields()
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/documents.py", line 1055, in check_hidden_fields
    hidden_fields = [
                    ^
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/documents.py", line 1058, in <listcomp>
    if get_extra_field_info(field, "hidden") is True
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xxxx/project/.venv/lib/python3.11/site-packages/beanie/odm/utils/pydantic.py", line 45, in get_extra_field_info
    return field.json_schema_extra.get(parameter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'function' object has no attribute 'get'

See Pydantic Documentation

To Reproduce

from pydantic import Field
from beanie import Document

def pop_default(s):
    s.pop('default')

class Model(Document):
    a: int = Field(default=1, json_schema_extra=pop_default)

Expected behavior
This should work and be compatible with Pydantic.

Hi! Thank you for the catch.