Skip to content

Commit a5329d3

Browse files
timgrahamWaVEV
authored andcommitted
add EmbeddedModelField support to ArrayField
1 parent 389e2e7 commit a5329d3

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

tests/model_fields_/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,20 @@ class D(EmbeddedModel):
160160
class E(EmbeddedModel):
161161
name = models.CharField(max_length=100)
162162
value = models.IntegerField()
163+
164+
165+
# ArrayField + EmbeddedModelField
166+
class Review(EmbeddedModel):
167+
title = models.CharField(max_length=255)
168+
rating = models.IntegerField()
169+
170+
def __str__(self):
171+
return self.title
172+
173+
174+
class Movie(models.Model):
175+
title = models.CharField(max_length=255)
176+
reviews = ArrayField(EmbeddedModelField(Review), null=True)
177+
178+
def __str__(self):
179+
return self.title

tests/model_fields_/test_embedded_model.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from django_mongodb_backend.fields import EmbeddedModelField
1818
from django_mongodb_backend.models import EmbeddedModel
1919

20-
from .models import A, Address, Author, B, Book, C, D, Data, E, Holder, Library
20+
from .models import A, Address, Author, B, Book, C, D, Data, E, Holder, Library, Movie, Review
2121
from .utils import truncate_ms
2222

2323

@@ -83,6 +83,63 @@ def test_pre_save(self):
8383
self.assertGreater(obj.data.auto_now, auto_now_two)
8484

8585

86+
class EmbeddedArrayTests(TestCase):
87+
def test_save_load(self):
88+
reviews = [
89+
Review(title="The best", rating=10),
90+
Review(title="Mediocre", rating=5),
91+
Review(title="Horrible", rating=1),
92+
]
93+
Movie.objects.create(title="Lion King", reviews=reviews)
94+
movie = Movie.objects.get(title="Lion King")
95+
self.assertEqual(movie.reviews[0].title, "The best")
96+
self.assertEqual(movie.reviews[0].rating, 10)
97+
self.assertEqual(movie.reviews[1].title, "Mediocre")
98+
self.assertEqual(movie.reviews[1].rating, 5)
99+
self.assertEqual(movie.reviews[2].title, "Horrible")
100+
self.assertEqual(movie.reviews[2].rating, 1)
101+
self.assertEqual(len(movie.reviews), 3)
102+
103+
def test_save_load_null(self):
104+
movie = Movie.objects.create(title="Lion King")
105+
movie = Movie.objects.get(title="Lion King")
106+
self.assertIsNone(movie.reviews)
107+
108+
109+
class EmbeddedArrayQueryingTests(TestCase):
110+
@classmethod
111+
def setUpTestData(cls):
112+
reviews = [
113+
Review(title="The best", rating=10),
114+
Review(title="Mediocre", rating=5),
115+
Review(title="Horrible", rating=1),
116+
]
117+
cls.clouds = Movie.objects.create(title="Clouds", reviews=reviews)
118+
reviews = [
119+
Review(title="Super", rating=9),
120+
Review(title="Meh", rating=5),
121+
Review(title="Horrible", rating=2),
122+
]
123+
cls.frozen = Movie.objects.create(title="Frozen", reviews=reviews)
124+
reviews = [
125+
Review(title="Excellent", rating=9),
126+
Review(title="Wow", rating=8),
127+
Review(title="Classic", rating=7),
128+
]
129+
cls.bears = Movie.objects.create(title="Bears", reviews=reviews)
130+
131+
def test_filter_with_field(self):
132+
self.assertCountEqual(
133+
Movie.objects.filter(reviews__title="Horrible"), [self.clouds, self.frozen]
134+
)
135+
136+
def test_filter_with_model(self):
137+
self.assertCountEqual(
138+
Movie.objects.filter(reviews=Review(title="Horrible", rating=2)),
139+
[self.clouds, self.frozen],
140+
)
141+
142+
86143
class QueryingTests(TestCase):
87144
@classmethod
88145
def setUpTestData(cls):

0 commit comments

Comments
 (0)