django-ninja-aio-crud 0.7.3__tar.gz → 0.7.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/PKG-INFO +1 -1
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/__init__.py +1 -1
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/models.py +17 -16
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/LICENSE +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/README.md +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/api.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/auth.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/exceptions.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/parsers.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/renders.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/schemas.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/types.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/ninja_aio/views.py +0 -0
- {django_ninja_aio_crud-0.7.3 → django_ninja_aio_crud-0.7.5}/pyproject.toml +0 -0
|
@@ -7,6 +7,7 @@ from ninja.orm import create_schema
|
|
|
7
7
|
from django.db import models
|
|
8
8
|
from django.http import HttpRequest
|
|
9
9
|
from django.core.exceptions import ObjectDoesNotExist
|
|
10
|
+
from asgiref.sync import sync_to_async
|
|
10
11
|
from django.db.models.fields.related_descriptors import (
|
|
11
12
|
ReverseManyToOneDescriptor,
|
|
12
13
|
ReverseOneToOneDescriptor,
|
|
@@ -19,6 +20,10 @@ from .exceptions import SerializeError
|
|
|
19
20
|
from .types import S_TYPES, F_TYPES, SCHEMA_TYPES, ModelSerializerMeta
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
async def agetattr(obj, name: str, default=None):
|
|
24
|
+
return await sync_to_async(getattr)(obj, name, default)
|
|
25
|
+
|
|
26
|
+
|
|
22
27
|
class ModelUtil:
|
|
23
28
|
def __init__(self, model: type["ModelSerializer"] | models.Model):
|
|
24
29
|
self.model = model
|
|
@@ -103,7 +108,7 @@ class ModelUtil:
|
|
|
103
108
|
continue
|
|
104
109
|
if self.model.is_optional(k) and v is None:
|
|
105
110
|
continue
|
|
106
|
-
field_obj =
|
|
111
|
+
field_obj = (await agetattr(self.model, k)).field
|
|
107
112
|
if isinstance(field_obj, models.BinaryField):
|
|
108
113
|
try:
|
|
109
114
|
payload |= {k: base64.b64decode(v)}
|
|
@@ -125,10 +130,10 @@ class ModelUtil:
|
|
|
125
130
|
payload = data.model_dump()
|
|
126
131
|
for k, v in payload.items():
|
|
127
132
|
try:
|
|
128
|
-
field_obj =
|
|
133
|
+
field_obj = (await agetattr(self.model, k)).field
|
|
129
134
|
except AttributeError:
|
|
130
135
|
try:
|
|
131
|
-
field_obj =
|
|
136
|
+
field_obj = (await agetattr(self.model, k)).related
|
|
132
137
|
except AttributeError:
|
|
133
138
|
pass
|
|
134
139
|
if isinstance(v, dict) and (
|
|
@@ -141,7 +146,7 @@ class ModelUtil:
|
|
|
141
146
|
)
|
|
142
147
|
if isinstance(field_obj, models.ForeignKey):
|
|
143
148
|
for rel_k, rel_v in v.items():
|
|
144
|
-
field_rel_obj =
|
|
149
|
+
field_rel_obj = await agetattr(rel, rel_k)
|
|
145
150
|
if isinstance(field_rel_obj, models.ForeignKey):
|
|
146
151
|
olds_k.append({rel_k: rel_v})
|
|
147
152
|
for obj in olds_k:
|
|
@@ -348,9 +353,9 @@ class ModelSerializer(models.Model, metaclass=ModelSerializerMeta):
|
|
|
348
353
|
@classmethod
|
|
349
354
|
def get_related_schema_data(cls):
|
|
350
355
|
fields = cls.get_fields("read")
|
|
351
|
-
custom_f =
|
|
352
|
-
|
|
353
|
-
for f in fields + custom_f:
|
|
356
|
+
custom_f = {name: (value, default) for name, value, default in cls.get_custom_fields("read")}
|
|
357
|
+
_related_fields = []
|
|
358
|
+
for f in fields + list(custom_f.keys()):
|
|
354
359
|
field_obj = getattr(cls, f)
|
|
355
360
|
if not isinstance(
|
|
356
361
|
field_obj,
|
|
@@ -362,18 +367,14 @@ class ModelSerializer(models.Model, metaclass=ModelSerializerMeta):
|
|
|
362
367
|
ForwardOneToOneDescriptor,
|
|
363
368
|
),
|
|
364
369
|
):
|
|
365
|
-
|
|
370
|
+
_related_fields.append(f)
|
|
366
371
|
|
|
367
|
-
if not
|
|
372
|
+
if not _related_fields:
|
|
368
373
|
return None, None
|
|
369
374
|
|
|
370
|
-
|
|
371
|
-
for f in
|
|
372
|
-
|
|
373
|
-
if f == custom[0]:
|
|
374
|
-
custom_related_fields.append(custom)
|
|
375
|
-
related_fields.remove(f)
|
|
376
|
-
|
|
375
|
+
|
|
376
|
+
custom_related_fields = [(f, *custom_f[f]) for f in _related_fields if f in custom_f]
|
|
377
|
+
related_fields = [f for f in _related_fields if f not in custom_f]
|
|
377
378
|
return related_fields, custom_related_fields
|
|
378
379
|
|
|
379
380
|
@classmethod
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|