7
7
8
8
from . import PolymorphicEmbeddedModelField
9
9
from .array import ArrayField , ArrayLenTransform
10
- from .embedded_model_array import KeyTransform as ArrayFieldKeyTransform
11
- from .embedded_model_array import KeyTransformFactory as ArrayFieldKeyTransformFactory
10
+ from .embedded_model_array import (
11
+ EmbeddedModelArrayFieldTransform ,
12
+ EmbeddedModelArrayFieldTransformFactory ,
13
+ )
12
14
13
15
14
16
class PolymorphicEmbeddedModelArrayField (ArrayField ):
@@ -62,7 +64,15 @@ def get_transform(self, name):
62
64
transform = super ().get_transform (name )
63
65
if transform :
64
66
return transform
65
- return KeyTransformFactory (name , self )
67
+ for model in self .base_field .embedded_models :
68
+ with contextlib .suppress (FieldDoesNotExist ):
69
+ field = model ._meta .get_field (name )
70
+ break
71
+ else :
72
+ raise FieldDoesNotExist (
73
+ f"The models of field '{ self .name } ' have no field named '{ name } '."
74
+ )
75
+ return PolymorphicArrayFieldTransformFactory (field )
66
76
67
77
def _get_lookup (self , lookup_name ):
68
78
lookup = super ()._get_lookup (lookup_name )
@@ -79,32 +89,23 @@ def as_mql(self, compiler, connection):
79
89
return EmbeddedModelArrayFieldLookups
80
90
81
91
82
- class KeyTransform ( ArrayFieldKeyTransform ):
92
+ class PolymorphicArrayFieldTransform ( EmbeddedModelArrayFieldTransform ):
83
93
field_class_name = "PolymorphicEmbeddedModelArrayField"
84
94
85
- def __init__ (self , key_name , array_field , * args , ** kwargs ):
86
- # Skip ArrayFieldKeyTransform .__init__()
95
+ def __init__ (self , field , * args , ** kwargs ):
96
+ # Skip EmbeddedModelArrayFieldTransform .__init__()
87
97
Transform .__init__ (self , * args , ** kwargs )
88
- self .array_field = array_field
89
- self .key_name = key_name
90
- for model in array_field .base_field .embedded_models :
91
- with contextlib .suppress (FieldDoesNotExist ):
92
- field = model ._meta .get_field (key_name )
93
- break
94
- else :
95
- raise FieldDoesNotExist (
96
- f"The models of field '{ array_field .name } ' have no field named '{ key_name } '."
97
- )
98
98
# Lookups iterate over the array of embedded models. A virtual column
99
99
# of the queried field's type represents each element.
100
100
column_target = field .clone ()
101
- column_name = f"$item.{ key_name } "
101
+ column_name = f"$item.{ field .column } "
102
+ column_target .name = f"{ field .name } "
102
103
column_target .db_column = column_name
103
104
column_target .set_attributes_from_name (column_name )
104
105
self ._lhs = Col (None , column_target )
105
106
self ._sub_transform = None
106
107
107
108
108
- class KeyTransformFactory ( ArrayFieldKeyTransformFactory ):
109
+ class PolymorphicArrayFieldTransformFactory ( EmbeddedModelArrayFieldTransformFactory ):
109
110
def __call__ (self , * args , ** kwargs ):
110
- return KeyTransform (self .key_name , self . base_field , * args , ** kwargs )
111
+ return PolymorphicArrayFieldTransform (self .field , * args , ** kwargs )
0 commit comments