@@ -106,6 +106,8 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
106106 sa_column = kwargs .pop ("sa_column" , Undefined )
107107 sa_column_args = kwargs .pop ("sa_column_args" , Undefined )
108108 sa_column_kwargs = kwargs .pop ("sa_column_kwargs" , Undefined )
109+ sa_foreign_key_args = kwargs .pop ("sa_foreign_key_args" , Undefined )
110+ sa_foreign_key_kwargs = kwargs .pop ("sa_foreign_key_kwargs" , Undefined )
109111 if sa_column is not Undefined :
110112 if sa_column_args is not Undefined :
111113 raise RuntimeError (
@@ -153,6 +155,8 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
153155 self .sa_column = sa_column
154156 self .sa_column_args = sa_column_args
155157 self .sa_column_kwargs = sa_column_kwargs
158+ self .sa_foreign_key_args = sa_foreign_key_args
159+ self .sa_foreign_key_kwargs = sa_foreign_key_kwargs
156160
157161
158162class RelationshipInfo (Representation ):
@@ -222,6 +226,8 @@ def Field(
222226 sa_type : Union [Type [Any ], UndefinedType ] = Undefined ,
223227 sa_column_args : Union [Sequence [Any ], UndefinedType ] = Undefined ,
224228 sa_column_kwargs : Union [Mapping [str , Any ], UndefinedType ] = Undefined ,
229+ sa_foreign_key_args : Union [Sequence [Any ], UndefinedType ] = Undefined ,
230+ sa_foreign_key_kwargs : Union [Mapping [str , Any ], UndefinedType ] = Undefined ,
225231 schema_extra : Optional [Dict [str , Any ]] = None ,
226232) -> Any :
227233 ...
@@ -303,6 +309,8 @@ def Field(
303309 sa_column : Union [Column , UndefinedType ] = Undefined , # type: ignore
304310 sa_column_args : Union [Sequence [Any ], UndefinedType ] = Undefined ,
305311 sa_column_kwargs : Union [Mapping [str , Any ], UndefinedType ] = Undefined ,
312+ sa_foreign_key_args : Union [Sequence [Any ], UndefinedType ] = Undefined ,
313+ sa_foreign_key_kwargs : Union [Mapping [str , Any ], UndefinedType ] = Undefined ,
306314 schema_extra : Optional [Dict [str , Any ]] = None ,
307315) -> Any :
308316 current_schema_extra = schema_extra or {}
@@ -340,6 +348,8 @@ def Field(
340348 sa_column = sa_column ,
341349 sa_column_args = sa_column_args ,
342350 sa_column_kwargs = sa_column_kwargs ,
351+ sa_foreign_key_args = sa_foreign_key_args ,
352+ sa_foreign_key_kwargs = sa_foreign_key_kwargs ,
343353 ** current_schema_extra ,
344354 )
345355 post_init_field_info (field_info )
@@ -638,7 +648,19 @@ def get_column_from_field(field: Any) -> Column: # type: ignore
638648 unique = False
639649 if foreign_key :
640650 assert isinstance (foreign_key , str )
641- args .append (ForeignKey (foreign_key ))
651+ sa_foreign_key_args = getattr (field_info , "sa_foreign_key_args" , Undefined )
652+ fk_args = (
653+ []
654+ if sa_foreign_key_args is Undefined
655+ else list (cast (Sequence [Any ], sa_foreign_key_args ))
656+ )
657+ sa_foreign_key_kwargs = getattr (field_info , "sa_foreign_key_kwargs" , Undefined )
658+ fk_kwargs = (
659+ {}
660+ if sa_foreign_key_kwargs is Undefined
661+ else cast (Dict [Any , Any ], sa_foreign_key_kwargs )
662+ )
663+ args .append (ForeignKey (foreign_key , * fk_args , ** fk_kwargs ))
642664 kwargs = {
643665 "primary_key" : primary_key ,
644666 "nullable" : nullable ,
0 commit comments