@@ -396,7 +396,6 @@ def get_model_field(self, field, **kwargs):
396
396
to_model = content_type .model
397
397
398
398
# Extract our custom parameters and keep only Django field parameters
399
- generating_models = kwargs .pop ('_generating_models' , getattr (self , '_generating_models' , set ()))
400
399
field_kwargs = {k : v for k , v in kwargs .items () if not k .startswith ('_' )}
401
400
field_kwargs .update ({"default" : field .default , "unique" : field .unique })
402
401
@@ -427,27 +426,7 @@ def get_model_field(self, field, **kwargs):
427
426
return f
428
427
else :
429
428
# For cross-referential fields, use skip_object_fields to avoid infinite loops
430
- # Check if we're in a recursion situation using the parameter or stored attribute
431
- if generating_models and custom_object_type .id in generating_models :
432
- # We're in a circular reference, don't call get_model() to prevent recursion
433
- # Use a string reference instead
434
- model_name = f"{ APP_LABEL } .{ custom_object_type .get_table_model_name (custom_object_type .id )} "
435
- # Generate a unique related_name to prevent reverse accessor conflicts
436
- table_model_name = field .custom_object_type .get_table_model_name (
437
- field .custom_object_type .id
438
- ).lower ()
439
- related_name = f"{ table_model_name } _{ field .name } _set"
440
- f = models .ForeignKey (
441
- model_name ,
442
- null = True ,
443
- blank = True ,
444
- on_delete = models .CASCADE ,
445
- related_name = related_name ,
446
- ** field_kwargs
447
- )
448
- return f
449
- else :
450
- model = custom_object_type .get_model (skip_object_fields = True )
429
+ model = custom_object_type .get_model (skip_object_fields = True )
451
430
else :
452
431
# to_model = content_type.model_class()._meta.object_name
453
432
to_ct = f"{ content_type .app_label } .{ to_model } "
@@ -479,19 +458,7 @@ def get_form_field(self, field, for_csv_import=False, **kwargs):
479
458
)
480
459
custom_object_type = CustomObjectType .objects .get (pk = custom_object_type_id )
481
460
482
- # Check if we're in a recursion situation
483
- generating_models = getattr (self , '_generating_models' , set ())
484
- if generating_models and custom_object_type .id in generating_models :
485
- # We're in a circular reference, don't call get_model() to prevent recursion
486
- # Use a minimal approach or return a basic field
487
- return DynamicModelChoiceField (
488
- queryset = custom_object_type .get_model (skip_object_fields = True ).objects .all (),
489
- required = field .required ,
490
- # Remove initial=field.default to allow Django to handle instance data properly
491
- selector = True ,
492
- )
493
- else :
494
- model = custom_object_type .get_model ()
461
+ model = custom_object_type .get_model ()
495
462
else :
496
463
# This is a regular NetBox model
497
464
model = content_type .model_class ()
@@ -801,20 +768,7 @@ def get_form_field(self, field, for_csv_import=False, **kwargs):
801
768
)
802
769
custom_object_type = CustomObjectType .objects .get (pk = custom_object_type_id )
803
770
804
- # For cross-referential fields, use skip_object_fields to avoid infinite loops
805
- # Check if we're in a recursion situation using the parameter or stored attribute
806
- generating_models = getattr (self , '_generating_models' , set ())
807
- if generating_models and custom_object_type .id in generating_models :
808
- # We're in a circular reference, don't call get_model() to prevent recursion
809
- # Use a minimal approach or return a basic field
810
- return DynamicModelMultipleChoiceField (
811
- queryset = custom_object_type .get_model (skip_object_fields = True ).objects .all (),
812
- required = field .required ,
813
- # Remove initial=field.default to allow Django to handle instance data properly
814
- selector = True ,
815
- )
816
- else :
817
- model = custom_object_type .get_model (skip_object_fields = True )
771
+ model = custom_object_type .get_model (skip_object_fields = True )
818
772
else :
819
773
# This is a regular NetBox model
820
774
model = content_type .model_class ()
@@ -905,13 +859,7 @@ def after_model_generation(self, instance, model, field_name):
905
859
# Self-referential field - resolve to current model
906
860
to_model = model
907
861
else :
908
- # Cross-referential field - check for recursion before calling get_model()
909
- generating_models = getattr (self , '_generating_models' , set ())
910
- if generating_models and custom_object_type .id in generating_models :
911
- # We're in a circular reference, don't call get_model() to prevent recursion
912
- return
913
- else :
914
- to_model = custom_object_type .get_model ()
862
+ to_model = custom_object_type .get_model ()
915
863
else :
916
864
to_ct = f"{ content_type .app_label } .{ content_type .model } "
917
865
to_model = apps .get_model (to_ct )
@@ -956,14 +904,7 @@ def create_m2m_table(self, instance, model, field_name):
956
904
pk = custom_object_type_id
957
905
)
958
906
959
- # Check if we're in a recursion situation
960
- generating_models = getattr (self , '_generating_models' , set ())
961
- if generating_models and custom_object_type .id in generating_models :
962
- # We're in a circular reference, don't call get_model() to prevent recursion
963
- # Use a minimal approach or skip this field
964
- return
965
- else :
966
- to_model = custom_object_type .get_model ()
907
+ to_model = custom_object_type .get_model ()
967
908
else :
968
909
to_model = content_type .model_class ()
969
910
0 commit comments