Skip to content

Commit 7cb897e

Browse files
timgrahamWaVEV
authored andcommitted
add EmbeddedModelField support to ArrayField
1 parent 223a271 commit 7cb897e

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

tests/model_fields_/models.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,47 @@ class Library(models.Model):
138138

139139
def __str__(self):
140140
return self.name
141+
142+
143+
class A(models.Model):
144+
b = EmbeddedModelField("B")
145+
146+
147+
class B(EmbeddedModel):
148+
c = EmbeddedModelField("C")
149+
name = models.CharField(max_length=100)
150+
value = models.IntegerField()
151+
152+
153+
class C(EmbeddedModel):
154+
d = EmbeddedModelField("D")
155+
name = models.CharField(max_length=100)
156+
value = models.IntegerField()
157+
158+
159+
class D(EmbeddedModel):
160+
e = EmbeddedModelField("E")
161+
nullable_e = EmbeddedModelField("E", null=True, blank=True)
162+
name = models.CharField(max_length=100)
163+
value = models.IntegerField()
164+
165+
166+
class E(EmbeddedModel):
167+
name = models.CharField(max_length=100)
168+
value = models.IntegerField()
169+
170+
171+
class Review(EmbeddedModel):
172+
title = models.CharField(max_length=255)
173+
rating = models.IntegerField()
174+
175+
def __str__(self):
176+
return self.title
177+
178+
179+
class Movie(models.Model):
180+
title = models.CharField(max_length=255)
181+
reviews = ArrayField(EmbeddedModelField(Review), null=True)
182+
183+
def __str__(self):
184+
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)