|
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