Skip to main content

Pydantic Package for Adding Models into a Django or Django Rest Framework Project ✨

Project description

Pyngo :snake:

Utils to help integrate pydantic into Django projects

Test Package version Supported Python versions Test


Installation

You can add pyngo in a few easy steps. First of all, install the dependency:

$ pip install pyngo

---> 100%

Successfully installed pyngo

Features 🎉

  • Using Pydantic to Build your Models in Django Project.
  • Using OpenAPI utilities to build params from a basic model.
  • using QueryDictModel to build Pydantic models from a QueryDict object.
  • propagate any errors from Pydantic in Django Rest Framework.
  • Tested in Python 3.10 and up.

Examples 📚

OpenAPI

  • pyngo.openapi_params() can build params from a basic model
from pydantic import BaseModel
from pyngo import openapi_params

class Model(BaseModel):
   bingo: int

print(openapi_params(Model))
  • pyngo.ParameterDict.required is set according to the type of the variable
from typing import Optional
from pydantic import BaseModel
from pyngo import openapi_params

class Model(BaseModel):
   required_param: int
   optional_param: Optional[int]

print(openapi_params(Model))

Other fields can be set through the field’s info:

from pydantic import BaseModel, Field
from pyngo import openapi_params

class WithDescription(BaseModel):
   described_param: str = Field(
      description="Hello World Use Me!"
   )

class InPath(BaseModel):
   path_param: str = Field(location="path")

class WithDeprecated(BaseModel):
   deprecated_field: bool = Field(deprecated=True)

class WithNoAllowEmpty(BaseModel):
   can_be_empty: bool = Field(allowEmptyValue=False)

print(openapi_params(WithDescription)[0]["description"])
print(openapi_params(InPath)[0]["in"])
print(openapi_params(WithDeprecated)[0]["deprecated"])
print(openapi_params(WithNoAllowEmpty)[0]["allowEmptyValue"])

Django

  • pyngo.querydict_to_dict() and pyngo.QueryDictModel are conveniences for building a pydantic.BaseModel from a django.QueryDict.
from typing import List
from django.http import QueryDict
from pydantic import BaseModel
from pyngo import QueryDictModel, querydict_to_dict

class Model(BaseModel):
   single_param: int
   list_param: List[str]

class QueryModel(QueryDictModel):
   single_param: int
   list_param: List[str]

query_dict = QueryDict("single_param=20&list_param=Life")

print(Model.model_validate(querydict_to_dict(query_dict, Model)))
print(QueryModel.model_validate(query_dict))

Note: Don't forget to Setup the Django Project.

Django Rest Framework

  • pyngo.drf_error_details() will propagate any errors from Pydantic.
from pydantic import BaseModel, ValidationError
from pyngo import drf_error_details

class Model(BaseModel):
   foo: int
   bar: str

data = {"foo": "Cat"}

try:
   Model.model_validate(data)
except ValidationError as e:
   print(drf_error_details(e))

Errors descend into nested fields:

from typing import List
from pydantic import BaseModel, ValidationError
from pyngo import drf_error_details

class Framework(BaseModel):
   frm_id: int

class Language(BaseModel):
   framework: List[Framework]

data = {"framework": [{"frm_id": "not_a_number"}, {}]}
expected_details = {
   "framework": {
      "0": {"frm_id": ["value is not a valid integer"]},
      "1": {"frm_id": ["field required"]},
   }
}

try:
   Language.model_validate(data)
except ValidationError as e:
   print(drf_error_details(e))

Development 🚧

Setup environment 📦

Install uv from https://docs.astral.sh/uv/ and just from your OS package manager or https://just.systems.

And then install the development dependencies:

# Install dependencies for development
uv sync --all-groups

Run tests 🌝

You can run all the tests with:

just test

Note: You can also generate a coverage report with:

just test-html

Format the code 🍂

Execute the following command to apply pre-commit formatting:

just format

Execute the following command to apply mypy type checking:

just lint

License 🍻

This project is licensed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyngo-2.4.1.tar.gz (43.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyngo-2.4.1-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

File details

Details for the file pyngo-2.4.1.tar.gz.

File metadata

  • Download URL: pyngo-2.4.1.tar.gz
  • Upload date:
  • Size: 43.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyngo-2.4.1.tar.gz
Algorithm Hash digest
SHA256 7cb71a92eea5fc4d9cff0df20667ad857251e5ae8d52e34f08a0bad748a7ccf9
MD5 33c5a81500ead3e6c0a26b1bf0d52771
BLAKE2b-256 626ad4c62e0fedcc1cf96525ef918be7282fce1ab394b5a3aaf0376335d4bce6

See more details on using hashes here.

File details

Details for the file pyngo-2.4.1-py3-none-any.whl.

File metadata

  • Download URL: pyngo-2.4.1-py3-none-any.whl
  • Upload date:
  • Size: 7.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyngo-2.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ca20d2f5c5a8de04b97bb3a1673883b0b297431464e7778ba12774a57671fc1d
MD5 55222dfe2d3b7d87d1b4fbab2227cf4f
BLAKE2b-256 ed8544f3d4a3a7309e4128b0bdcb3638f9fc7f561c3f42e210ddd637b39fd67f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page