Skip to content

Commit 29a8e19

Browse files
committed
add EmbeddedModelField support to ArrayField
1 parent 3885833 commit 29a8e19

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

tests/model_fields_/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,20 @@ class Library(models.Model):
143143

144144
def __str__(self):
145145
return self.name
146+
147+
148+
# ArrayField + EmbeddedModelField
149+
class Review(EmbeddedModel):
150+
title = models.CharField(max_length=255)
151+
rating = models.IntegerField()
152+
153+
def __str__(self):
154+
return self.title
155+
156+
157+
class Movie(models.Model):
158+
title = models.CharField(max_length=255)
159+
reviews = ArrayField(EmbeddedModelField(Review), null=True)
160+
161+
def __str__(self):
162+
return self.title

tests/model_fields_/test_embedded_model.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
Data,
2525
Holder,
2626
Library,
27+
Movie,
2728
NestedData,
29+
Review,
2830
)
2931
from .utils import truncate_ms
3032

@@ -96,6 +98,63 @@ def test_pre_save(self):
9698
self.assertGreater(obj.data.auto_now, auto_now_two)
9799

98100

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

0 commit comments

Comments
 (0)