|
7 | 7 | from django.db.models.lookups import Transform |
8 | 8 |
|
9 | 9 | from .. import forms |
10 | | -from .json import build_json_mql_path |
11 | 10 |
|
12 | 11 |
|
13 | 12 | class EmbeddedModelField(models.Field): |
@@ -163,49 +162,29 @@ def get_transform(self, name): |
163 | 162 | Validate that `name` is either a field of an embedded model or a |
164 | 163 | lookup on an embedded model's field. |
165 | 164 | """ |
166 | | - result = None |
167 | | - if isinstance(self.ref_field, EmbeddedModelField): |
168 | | - opts = self.ref_field.embedded_model._meta |
169 | | - new_field = opts.get_field(name) |
170 | | - result = KeyTransformFactory(name, new_field) |
| 165 | + if transform := self.ref_field.get_transform(name): |
| 166 | + return transform |
| 167 | + suggested_lookups = difflib.get_close_matches(name, self.ref_field.get_lookups()) |
| 168 | + if suggested_lookups: |
| 169 | + suggested_lookups = " or ".join(suggested_lookups) |
| 170 | + suggestion = f", perhaps you meant {suggested_lookups}?" |
171 | 171 | else: |
172 | | - if self.ref_field.get_transform(name) is None: |
173 | | - suggested_lookups = difflib.get_close_matches(name, self.ref_field.get_lookups()) |
174 | | - if suggested_lookups: |
175 | | - suggested_lookups = " or ".join(suggested_lookups) |
176 | | - suggestion = f", perhaps you meant {suggested_lookups}?" |
177 | | - else: |
178 | | - suggestion = "." |
179 | | - raise FieldDoesNotExist( |
180 | | - f"Unsupported lookup '{name}' for " |
181 | | - f"{self.ref_field.__class__.__name__} '{self.ref_field.name}'" |
182 | | - f"{suggestion}" |
183 | | - ) |
184 | | - result = KeyTransformFactory(name, self.ref_field) |
185 | | - return result |
| 172 | + suggestion = "." |
| 173 | + raise FieldDoesNotExist( |
| 174 | + f"Unsupported lookup '{name}' for " |
| 175 | + f"{self.ref_field.__class__.__name__} '{self.ref_field.name}'" |
| 176 | + f"{suggestion}" |
| 177 | + ) |
186 | 178 |
|
187 | | - def preprocess_lhs(self, compiler, connection): |
| 179 | + def as_mql(self, compiler, connection): |
188 | 180 | previous = self |
189 | | - embedded_key_transforms = [] |
190 | | - json_key_transforms = [] |
| 181 | + key_transforms = [] |
191 | 182 | while isinstance(previous, KeyTransform): |
192 | | - if isinstance(previous.ref_field, EmbeddedModelField): |
193 | | - embedded_key_transforms.insert(0, previous.key_name) |
194 | | - else: |
195 | | - json_key_transforms.insert(0, previous.key_name) |
| 183 | + key_transforms.insert(0, previous.key_name) |
196 | 184 | previous = previous.lhs |
197 | 185 | mql = previous.as_mql(compiler, connection) |
198 | | - # The first json_key_transform is the field name. |
199 | | - embedded_key_transforms.append(json_key_transforms.pop(0)) |
200 | | - return mql, embedded_key_transforms, json_key_transforms |
201 | | - |
202 | | - def as_mql(self, compiler, connection): |
203 | | - mql, key_transforms, json_key_transforms = self.preprocess_lhs(compiler, connection) |
204 | 186 | transforms = ".".join(key_transforms) |
205 | | - result = f"{mql}.{transforms}" |
206 | | - if json_key_transforms: |
207 | | - result = build_json_mql_path(result, json_key_transforms) |
208 | | - return result |
| 187 | + return f"{mql}.{transforms}" |
209 | 188 |
|
210 | 189 | @property |
211 | 190 | def output_field(self): |
|
0 commit comments