|
1 | 1 | from ..forms import EmbeddedModelArrayFormField |
| 2 | +from ..query_utils import process_rhs |
2 | 3 | from . import EmbeddedModelField |
3 | 4 | from .array import ArrayField |
4 | | -from .embedded_model import EMFExact |
| 5 | +from .embedded_model import EMFExact, KeyTransformFactory |
5 | 6 |
|
6 | 7 |
|
7 | 8 | class EmbeddedModelArrayField(ArrayField): |
@@ -38,17 +39,29 @@ def formfield(self, **kwargs): |
38 | 39 | ) |
39 | 40 |
|
40 | 41 | def get_transform(self, name): |
41 | | - # TODO: ... |
42 | | - return self.base_field.get_transform(name) |
| 42 | + # return self.base_field.get_transform(name) |
43 | 43 | # Copied from EmbedddedModelField -- customize? |
44 | | - # transform = super().get_transform(name) |
45 | | - # if transform: |
46 | | - # return transform |
47 | | - # field = self.embedded_model._meta.get_field(name) |
48 | | - # return KeyTransformFactory(name, field) |
| 44 | + if transform := super().get_transform(name): |
| 45 | + return transform |
| 46 | + if name.isdigit(): |
| 47 | + return KeyTransformFactory(name, self) |
| 48 | + field = self.embedded_model._meta.get_field(name) |
| 49 | + return KeyTransformFactory(name, field) |
49 | 50 |
|
50 | 51 |
|
51 | 52 | @EmbeddedModelArrayField.register_lookup |
52 | 53 | class EMFArrayExact(EMFExact): |
53 | | - # TODO |
54 | | - pass |
| 54 | + def as_mql(self, compiler, connection): |
| 55 | + mql, key_transforms, json_key_transforms = self.lhs.preprocess_lhs(compiler, connection) |
| 56 | + transforms = ".".join(key_transforms) |
| 57 | + value = process_rhs(self, compiler, connection) |
| 58 | + # return {"$anyElementTrue": []} |
| 59 | + # transforms = build_json_mql_path("$$this", key_transforms) |
| 60 | + return { |
| 61 | + "$reduce": { |
| 62 | + "input": mql, |
| 63 | + "initialValue": False, |
| 64 | + "in": {"$or": ["$$value", {"$eq": [f"$$this.{transforms}", value]}]}, |
| 65 | + } |
| 66 | + } |
| 67 | + # return super().as_mql(compiler, connection) |
0 commit comments