@@ -61,6 +61,21 @@ def _create_model_operation(self, model_state: ModelState) -> CreateModel:
6161 bases = [base .__name__ for base in model_state .bases ],
6262 )
6363
64+ @staticmethod
65+ def _dependency_key_for_field (field : object ) -> ModelKey | None :
66+ if not isinstance (field , (ForeignKeyFieldInstance , ManyToManyFieldInstance )):
67+ return None
68+ ref = getattr (field , "model_name" , None )
69+ if not ref :
70+ return None
71+ if isinstance (ref , str ):
72+ parts = ref .split ("." )
73+ if len (parts ) != 2 :
74+ return None
75+ return parts [0 ], parts [1 ]
76+ # model_name is a model class
77+ return getattr (ref ._meta , "app" , "" ), ref .__name__
78+
6479 @staticmethod
6580 def _sort_by_dependencies (keys : list [ModelKey ], state : State ) -> list [ModelKey ]:
6681 """Sort model keys so that FK/M2M dependencies come before dependents."""
@@ -70,21 +85,8 @@ def _sort_by_dependencies(keys: list[ModelKey], state: State) -> list[ModelKey]:
7085 for key in keys :
7186 model_state = state .models [key ]
7287 for field in model_state .fields .values ():
73- if not isinstance (field , (ForeignKeyFieldInstance , ManyToManyFieldInstance )):
74- continue
75- ref = getattr (field , "model_name" , None )
76- if not ref :
77- continue
78- if isinstance (ref , str ):
79- parts = ref .split ("." )
80- if len (parts ) == 2 :
81- dep_key : ModelKey = (parts [0 ], parts [1 ])
82- else :
83- continue
84- else :
85- # model_name is a model class
86- dep_key = (getattr (ref ._meta , "app" , "" ), ref .__name__ )
87- if dep_key in key_set and dep_key != key :
88+ dep_key = OperationGenerator ._dependency_key_for_field (field )
89+ if dep_key and dep_key in key_set and dep_key != key :
8890 deps [key ].add (dep_key )
8991
9092 # Kahn's algorithm
0 commit comments