From af389ce76af86607a00ac8edf594227d0e51697b Mon Sep 17 00:00:00 2001 From: Nickolas Grigoriadis Date: Mon, 2 Dec 2024 10:25:44 +0000 Subject: [PATCH 1/2] Add IP4/6Network and Url serialisation --- ninja/responses.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ninja/responses.py b/ninja/responses.py index babd366e6..6a0fd4ca2 100644 --- a/ninja/responses.py +++ b/ninja/responses.py @@ -1,10 +1,11 @@ from enum import Enum -from ipaddress import IPv4Address, IPv6Address +from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network from typing import Any, FrozenSet from django.core.serializers.json import DjangoJSONEncoder from django.http import JsonResponse from pydantic import BaseModel +from pydantic_core import Url __all__ = [ "NinjaJSONEncoder", @@ -21,7 +22,9 @@ class NinjaJSONEncoder(DjangoJSONEncoder): def default(self, o: Any) -> Any: if isinstance(o, BaseModel): return o.model_dump() - if isinstance(o, (IPv4Address, IPv6Address)): + if isinstance(o, Url): + return str(o) + if isinstance(o, (IPv4Address, IPv4Network, IPv6Address, IPv6Network)): return str(o) if isinstance(o, Enum): return str(o) From 092d4c733e0e19aaab75149552080c94b061d771 Mon Sep 17 00:00:00 2001 From: Vitaliy Kucheryaviy Date: Fri, 6 Dec 2024 20:01:35 +0200 Subject: [PATCH 2/2] added tests for pydantic.URL serialization --- tests/test_response.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_response.py b/tests/test_response.py index 6b234a6cb..72921ddc3 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -6,6 +6,7 @@ import pytest from django.http import HttpResponse from pydantic import BaseModel, ValidationError +from pydantic_core import Url from ninja import Router from ninja.responses import Response @@ -172,3 +173,10 @@ def test_enum_encoding(): response = Response(data) response_data = json.loads(response.content) assert response_data["enum"] == str(data["enum"]) + + +def test_pydantic_url(): + data = {"url": Url("https://django-ninja.dev/")} + response = Response(data) + response_data = json.loads(response.content) + assert response_data == {"url": "https://django-ninja.dev/"}