RefForeignKey
class¶
edgy.fields.RefForeignKey
¶
Bases: ForeignKeyFieldFactory
, list
A specialized foreign key field designed to work with ModelRef
classes.
This field allows a model to establish a relationship with a ModelRef
,
which represents a reference to another model without necessarily defining
a direct foreign key column in the database. It is particularly useful
for handling generic relationships or when the related model's details
are managed through a separate "through" model or a ModelRef
.
It enforces that the to
argument is an instance of ModelRef
and that
the ModelRef
subclass has a __related_name__
defined.
ATTRIBUTE | DESCRIPTION |
---|---|
field_type |
The Python type representing the field (always
TYPE:
|
field_bases |
The base classes for this field, including
TYPE:
|
methods_overwritable_by_factory
class-attribute
instance-attribute
¶
methods_overwritable_by_factory = frozenset(default_methods_overwritable_by_factory)
build_field
classmethod
¶
build_field(**kwargs)
Constructs and returns a new field instance based on the factory's configuration.
This method orchestrates the creation of a BaseFieldType
instance.
It determines the column type, Pydantic type, and constraints from the
provided kwargs
and the factory's properties. It then instantiates
the field and calls overwrite_methods
to apply any factory-defined
method overrides.
PARAMETER | DESCRIPTION |
---|---|
**kwargs
|
Keyword arguments for configuring the field.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
BaseFieldType
|
The newly constructed and configured field instance.
TYPE:
|
Source code in edgy/core/db/fields/factories.py
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
|
overwrite_methods
classmethod
¶
overwrite_methods(field_obj)
Overwrites methods on the given field_obj
with methods defined in the factory.
This method iterates through the factory's own methods. If a method's name
is present in methods_overwritable_by_factory
, it replaces the corresponding
method on the field_obj
. It handles class methods and ensures proper
staticmethod
wrapping for consistent behavior across Python versions.
PARAMETER | DESCRIPTION |
---|---|
field_obj
|
The field instance whose methods are to be overwritten.
TYPE:
|
Source code in edgy/core/db/fields/factories.py
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
|
repack
classmethod
¶
repack(field_obj)
Repacks methods on the given field_obj
that were previously overwritten
by the factory.
This method is used to re-apply the partial
and staticmethod
wrappers
to methods that were already overwritten. This can be necessary in scenarios
where field objects are serialized/deserialized or otherwise lose their
original method bindings. It ensures that the context (cls
, field_obj
)
remains correctly bound.
PARAMETER | DESCRIPTION |
---|---|
field_obj
|
The field instance whose methods are to be repacked.
TYPE:
|
Source code in edgy/core/db/fields/factories.py
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
|
validate
classmethod
¶
validate(kwargs)
Validates the parameters for a foreign key field.
This method enforces rules specific to foreign keys, such as:
- on_delete
must not be null.
- If SET_NULL
is used for on_delete
or on_update
, the field must be nullable.
- related_name
must be a string if provided and not False
.
It also sets a default null
value if not provided.
PARAMETER | DESCRIPTION |
---|---|
kwargs
|
A dictionary of parameters for the foreign key field.
TYPE:
|
RAISES | DESCRIPTION |
---|---|
FieldDefinitionError
|
If any foreign key validation rule is violated. |
Source code in edgy/core/db/fields/factories.py
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
|
get_constraints
classmethod
¶
get_constraints(kwargs)
Returns a sequence of constraints applicable to the column.
This method can be overridden by subclasses to provide specific database constraints for the column associated with this field type.
PARAMETER | DESCRIPTION |
---|---|
kwargs
|
Keyword arguments provided during field creation.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Sequence[Any]
|
Sequence[Any]: A sequence of constraint objects. |
Source code in edgy/core/db/fields/factories.py
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
|
get_column_type
classmethod
¶
get_column_type(kwargs)
Returns the SQL column type for the field.
For regular fields, this will return the appropriate SQLAlchemy column type.
For meta fields (fields that don't directly map to a database column),
it should return None
.
PARAMETER | DESCRIPTION |
---|---|
kwargs
|
Keyword arguments provided during field creation.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Any
|
The SQLAlchemy column type or
TYPE:
|
Source code in edgy/core/db/fields/factories.py
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
|
get_pydantic_type
classmethod
¶
get_pydantic_type(kwargs)
Returns the Pydantic type for the field.
This type is used by Pydantic for validation and serialization. By default,
it returns the field_type
attribute of the factory.
PARAMETER | DESCRIPTION |
---|---|
kwargs
|
Keyword arguments provided during field creation.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Any
|
The Pydantic type associated with the field.
TYPE:
|
Source code in edgy/core/db/fields/factories.py
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 |
|
_get_field_cls
cached
staticmethod
¶
_get_field_cls()
Internal static method to dynamically create and cache the actual field class.
This method uses lru_cache
to ensure that the field class is created
only once for each FieldFactory
type. It constructs a new type based
on the FieldFactory
's __name__
and field_bases
.
PARAMETER | DESCRIPTION |
---|---|
cls
|
The
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
BaseFieldType
|
The dynamically created and cached field class.
TYPE:
|
Source code in edgy/core/db/fields/factories.py
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 |
|
modify_input
classmethod
¶
modify_input(field_obj, name, kwargs, original_fn=None)
Modifies the input kwargs
during model initialization.
If the field name is not present in kwargs
and the phase is init_db
,
it initializes the field with an empty list. This ensures that the field
is always a list, ready to store ModelRef
instances.
Source code in edgy/core/db/fields/ref_foreign_key.py
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
embed_field
¶
embed_field(prefix, new_fieldname, owner=None, parent=None)
Placeholder for embedding logic. RefForeignKey
typically does not
embed directly into queries in the same way as traditional foreign keys,
as its values are often handled through the associated __related_name__
.
Source code in edgy/core/db/fields/ref_foreign_key.py
69 70 71 72 73 74 75 76 77 78 79 80 81 |
|
post_save_callback
async
classmethod
¶
post_save_callback(field_obj, value, is_update, original_fn=None)
Asynchronous post-save callback for RefForeignKey
.
This callback is executed after a model instance containing this field is saved.
It processes the list of ModelRef
instances provided in value
and
establishes the actual relationships by adding them to the related field
(determined by the __related_name__
on the ModelRef
).
PARAMETER | DESCRIPTION |
---|---|
field_obj
|
The field object itself.
TYPE:
|
value
|
The list of
TYPE:
|
is_update
|
TYPE:
|
original_fn
|
The original callback function (if any).
TYPE:
|
Source code in edgy/core/db/fields/ref_foreign_key.py
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
|