Skip to content

Commit 89ea845

Browse files
timgrahamWaVEV
authored andcommitted
add EmbeddedModelField support to ArrayField
1 parent 825ffca commit 89ea845

File tree

3 files changed

+83
-1
lines changed

3 files changed

+83
-1
lines changed

django_mongodb_backend/fields/embedded_model_array.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .. import forms
44
from . import EmbeddedModelField
55
from .array import ArrayField
6+
from .embedded_model import EMFExact
67

78

89
class EmbeddedModelArrayField(ArrayField):
@@ -44,3 +45,19 @@ def formfield(self, **kwargs):
4445
**kwargs,
4546
},
4647
)
48+
49+
def get_transform(self, name):
50+
# TODO: ...
51+
return self.base_field.get_transform(name)
52+
# Copied from EmbedddedModelField -- customize?
53+
# transform = super().get_transform(name)
54+
# if transform:
55+
# return transform
56+
# field = self.embedded_model._meta.get_field(name)
57+
# return KeyTransformFactory(name, field)
58+
59+
60+
@EmbeddedModelArrayField.register_lookup
61+
class EMFArrayExact(EMFExact):
62+
# TODO
63+
pass

tests/model_fields_/test_embedded_model.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,22 @@
1717
from django_mongodb_backend.fields import EmbeddedModelField
1818
from django_mongodb_backend.models import EmbeddedModel
1919

20+
2021
from .models import (
22+
A,
2123
Address,
2224
Author,
25+
B,
2326
Book,
27+
C,
28+
D,
2429
Data,
30+
E,
2531
Holder,
2632
Library,
33+
Movie,
2734
NestedData,
35+
Review,
2836
)
2937
from .utils import truncate_ms
3038

@@ -96,6 +104,63 @@ def test_pre_save(self):
96104
self.assertGreater(obj.data.auto_now, auto_now_two)
97105

98106

107+
class EmbeddedArrayTests(TestCase):
108+
def test_save_load(self):
109+
reviews = [
110+
Review(title="The best", rating=10),
111+
Review(title="Mediocre", rating=5),
112+
Review(title="Horrible", rating=1),
113+
]
114+
Movie.objects.create(title="Lion King", reviews=reviews)
115+
movie = Movie.objects.get(title="Lion King")
116+
self.assertEqual(movie.reviews[0].title, "The best")
117+
self.assertEqual(movie.reviews[0].rating, 10)
118+
self.assertEqual(movie.reviews[1].title, "Mediocre")
119+
self.assertEqual(movie.reviews[1].rating, 5)
120+
self.assertEqual(movie.reviews[2].title, "Horrible")
121+
self.assertEqual(movie.reviews[2].rating, 1)
122+
self.assertEqual(len(movie.reviews), 3)
123+
124+
def test_save_load_null(self):
125+
movie = Movie.objects.create(title="Lion King")
126+
movie = Movie.objects.get(title="Lion King")
127+
self.assertIsNone(movie.reviews)
128+
129+
130+
class EmbeddedArrayQueryingTests(TestCase):
131+
@classmethod
132+
def setUpTestData(cls):
133+
reviews = [
134+
Review(title="The best", rating=10),
135+
Review(title="Mediocre", rating=5),
136+
Review(title="Horrible", rating=1),
137+
]
138+
cls.clouds = Movie.objects.create(title="Clouds", reviews=reviews)
139+
reviews = [
140+
Review(title="Super", rating=9),
141+
Review(title="Meh", rating=5),
142+
Review(title="Horrible", rating=2),
143+
]
144+
cls.frozen = Movie.objects.create(title="Frozen", reviews=reviews)
145+
reviews = [
146+
Review(title="Excellent", rating=9),
147+
Review(title="Wow", rating=8),
148+
Review(title="Classic", rating=7),
149+
]
150+
cls.bears = Movie.objects.create(title="Bears", reviews=reviews)
151+
152+
def test_filter_with_field(self):
153+
self.assertCountEqual(
154+
Movie.objects.filter(reviews__title="Horrible"), [self.clouds, self.frozen]
155+
)
156+
157+
def test_filter_with_model(self):
158+
self.assertCountEqual(
159+
Movie.objects.filter(reviews=Review(title="Horrible", rating=2)),
160+
[self.clouds, self.frozen],
161+
)
162+
163+
99164
class QueryingTests(TestCase):
100165
@classmethod
101166
def setUpTestData(cls):

tests/model_forms_/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __str__(self):
4040
class Movie(models.Model):
4141
title = models.CharField(max_length=255)
4242
reviews = EmbeddedModelArrayField(Review)
43-
featured_reviews = EmbeddedModelArrayField(Review, null=True, blank=True, max_size=2)
43+
featured_reviews = EmbeddedModelArrayField(Review, null=True, blank=True)
4444

4545
def __str__(self):
4646
return self.title

0 commit comments

Comments
 (0)