Skip to content

Commit ed41ef8

Browse files
authored
Merge pull request #1353 from vitalik/grigi/master
Add IPNetwork and Url serialisation
2 parents 5a4cbe7 + 092d4c7 commit ed41ef8

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

ninja/responses.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from enum import Enum
2-
from ipaddress import IPv4Address, IPv6Address
2+
from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network
33
from typing import Any, FrozenSet
44

55
from django.core.serializers.json import DjangoJSONEncoder
66
from django.http import JsonResponse
77
from pydantic import BaseModel
8+
from pydantic_core import Url
89

910
__all__ = [
1011
"NinjaJSONEncoder",
@@ -21,7 +22,9 @@ class NinjaJSONEncoder(DjangoJSONEncoder):
2122
def default(self, o: Any) -> Any:
2223
if isinstance(o, BaseModel):
2324
return o.model_dump()
24-
if isinstance(o, (IPv4Address, IPv6Address)):
25+
if isinstance(o, Url):
26+
return str(o)
27+
if isinstance(o, (IPv4Address, IPv4Network, IPv6Address, IPv6Network)):
2528
return str(o)
2629
if isinstance(o, Enum):
2730
return str(o)

tests/test_response.py

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77
from django.http import HttpResponse
88
from pydantic import BaseModel, ValidationError
9+
from pydantic_core import Url
910

1011
from ninja import Router
1112
from ninja.responses import Response
@@ -172,3 +173,10 @@ def test_enum_encoding():
172173
response = Response(data)
173174
response_data = json.loads(response.content)
174175
assert response_data["enum"] == str(data["enum"])
176+
177+
178+
def test_pydantic_url():
179+
data = {"url": Url("https://django-ninja.dev/")}
180+
response = Response(data)
181+
response_data = json.loads(response.content)
182+
assert response_data == {"url": "https://django-ninja.dev/"}

0 commit comments

Comments
 (0)