django-ninja-aio-crud 0.6.4__tar.gz → 0.7.0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-ninja-aio-crud
3
- Version: 0.6.4
3
+ Version: 0.7.0
4
4
  Summary: Django Ninja AIO CRUD - Rest Framework
5
5
  Author: Giuseppe Casillo
6
6
  Requires-Python: >=3.10
@@ -1,6 +1,6 @@
1
1
  """Django Ninja AIO CRUD - Rest Framework"""
2
2
 
3
- __version__ = "0.6.4"
3
+ __version__ = "0.7.0"
4
4
 
5
5
  from .api import NinjaAIO
6
6
 
@@ -11,6 +11,8 @@ from django.db.models.fields.related_descriptors import (
11
11
  ReverseManyToOneDescriptor,
12
12
  ReverseOneToOneDescriptor,
13
13
  ManyToManyDescriptor,
14
+ ForwardManyToOneDescriptor,
15
+ ForwardOneToOneDescriptor,
14
16
  )
15
17
 
16
18
  from .exceptions import SerializeError
@@ -99,7 +101,7 @@ class ModelUtil:
99
101
  if isinstance(self.model, ModelSerializerMeta):
100
102
  if self.model.is_custom(k):
101
103
  continue
102
- if self.model.is_optional(k) and k is None:
104
+ if self.model.is_optional(k) and v is None:
103
105
  continue
104
106
  field_obj = getattr(self.model, k).field
105
107
  if isinstance(field_obj, models.BinaryField):
@@ -332,6 +334,41 @@ class ModelSerializer(models.Model, metaclass=ModelSerializerMeta):
332
334
  """
333
335
  pass
334
336
 
337
+ @classmethod
338
+ def get_forward_relation_schema(cls, obj: type["ModelSerializer"], field: str):
339
+ cls_f = []
340
+ for rel_f in obj.ReadSerializer.fields:
341
+ rel_f_obj = getattr(obj, rel_f)
342
+ if isinstance(
343
+ rel_f_obj,
344
+ (
345
+ ManyToManyDescriptor,
346
+ ReverseManyToOneDescriptor,
347
+ ReverseOneToOneDescriptor,
348
+ ),
349
+ ):
350
+ if isinstance(rel_f_obj, ManyToManyDescriptor):
351
+ rel_obj: ModelSerializer = rel_f_obj.field.related_model
352
+ if rel_f_obj.reverse:
353
+ rel_obj = rel_f_obj.field.model
354
+ elif isinstance(rel_f_obj, ReverseManyToOneDescriptor):
355
+ rel_obj = rel_f_obj.field.model
356
+ else: # ReverseOneToOneDescriptor
357
+ rel_obj = rel_f_obj.related.related_model
358
+ if not rel_obj == cls:
359
+ continue
360
+ cls_f.append(rel_f)
361
+ obj.ReadSerializer.fields.remove(rel_f)
362
+ rel_schema = obj.generate_read_s(depth=0)
363
+ rel_data = (
364
+ field,
365
+ rel_schema | None,
366
+ None,
367
+ )
368
+ if len(cls_f) > 0:
369
+ obj.ReadSerializer.fields.append(*cls_f)
370
+ return rel_data
371
+
335
372
  @classmethod
336
373
  def get_reverse_relation_schema(
337
374
  cls, obj: type["ModelSerializer"], rel_type: type[REL_TYPES], field: str
@@ -372,6 +409,7 @@ class ModelSerializer(models.Model, metaclass=ModelSerializerMeta):
372
409
  def get_schema_out_data(cls):
373
410
  fields = []
374
411
  reverse_rels = []
412
+ rels = []
375
413
  for f in cls.get_fields("read"):
376
414
  field_obj = getattr(cls, f)
377
415
  if isinstance(
@@ -394,15 +432,26 @@ class ModelSerializer(models.Model, metaclass=ModelSerializerMeta):
394
432
  rel_obj = field_obj.related.related_model
395
433
  rel_type = "one"
396
434
 
435
+ if not rel_obj.get_fields("read") or not rel_obj.get_custom_fields("read"):
436
+ continue
397
437
  rel_data = cls.get_reverse_relation_schema(rel_obj, rel_type, f)
398
438
  reverse_rels.append(rel_data)
399
439
  continue
440
+ if isinstance(
441
+ field_obj, (ForwardOneToOneDescriptor, ForwardManyToOneDescriptor)
442
+ ):
443
+ rel_obj = field_obj.field.related_model
444
+ if not rel_obj.get_fields("read") or not rel_obj.get_custom_fields("read"):
445
+ continue
446
+ rel_data = cls.get_forward_relation_schema(rel_obj, f)
447
+ rels.append(rel_data)
448
+ continue
400
449
  fields.append(f)
401
450
  return (
402
451
  fields,
403
452
  reverse_rels,
404
453
  cls.get_excluded_fields("read"),
405
- cls.get_custom_fields("read"),
454
+ cls.get_custom_fields("read") + rels,
406
455
  )
407
456
 
408
457
  @classmethod