Skip to content

Commit 7655578

Browse files
timgrahamWaVEV
authored andcommitted
add EmbeddedModelField support to ArrayField
1 parent 9304b0c commit 7655578

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

tests/model_fields_/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,20 @@ class D(EmbeddedModel):
166166
class E(EmbeddedModel):
167167
name = models.CharField(max_length=100)
168168
value = models.IntegerField()
169+
170+
171+
# ArrayField + EmbeddedModelField
172+
class Review(EmbeddedModel):
173+
title = models.CharField(max_length=255)
174+
rating = models.IntegerField()
175+
176+
def __str__(self):
177+
return self.title
178+
179+
180+
class Movie(models.Model):
181+
title = models.CharField(max_length=255)
182+
reviews = ArrayField(EmbeddedModelField(Review), null=True)
183+
184+
def __str__(self):
185+
return self.title

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):

0 commit comments

Comments
 (0)