Skip to content

Commit a917aa4

Browse files
committed
Iteration over f_expressions example
1 parent 5373be2 commit a917aa4

File tree

7 files changed

+74
-46
lines changed

7 files changed

+74
-46
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db import models
2+
3+
"""
4+
This is a basic model used to illustrate
5+
JSON field increment with f expressions
6+
"""
7+
8+
9+
class SomeDataModel(models.Model):
10+
name = models.CharField(
11+
max_length=255,
12+
blank=True,
13+
)
14+
stored_field = models.JSONField(
15+
blank=True,
16+
)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from django.test import TestCase
2+
3+
from styleguide_example.blog_examples.f_expressions.db_functions import JSONIncrement
4+
from styleguide_example.blog_examples.models import SomeDataModel
5+
6+
7+
class JSONIncrementTests(TestCase):
8+
def setUp(self) -> None:
9+
self.first_entity_stored_field = {"first_key": 1, "second_key": 2, "third_key": 3}
10+
self.second_entity_stored_field = {"first_key": 4, "second_key": 5, "third_key": 6}
11+
self.increment_value = 10
12+
13+
def test_json_increment_in_model(self):
14+
SomeDataModel.objects.bulk_create(
15+
[
16+
SomeDataModel(name="First name", stored_field=self.first_entity_stored_field),
17+
SomeDataModel(name="Second name", stored_field=self.second_entity_stored_field),
18+
]
19+
)
20+
21+
first_entity = SomeDataModel.objects.first()
22+
second_entity = SomeDataModel.objects.last()
23+
24+
expected_first_entity_stored_field = self.first_entity_stored_field
25+
actual_first_entity_stored_field = first_entity.stored_field
26+
27+
expected_second_entity_stored_field = self.second_entity_stored_field
28+
actual_second_entity_stored_field = second_entity.stored_field
29+
30+
self.assertEqual(expected_first_entity_stored_field, actual_first_entity_stored_field)
31+
self.assertEqual(expected_second_entity_stored_field, actual_second_entity_stored_field)
32+
33+
SomeDataModel.objects.filter(name="First name").update(
34+
stored_field=JSONIncrement("stored_field__first_key", self.increment_value)
35+
)
36+
37+
first_entity = SomeDataModel.objects.first()
38+
second_entity = SomeDataModel.objects.last()
39+
40+
"""
41+
Expect only first_entity JSON field with name first_key to be incremented
42+
"""
43+
44+
expected_first_entity_stored_field = {
45+
"first_key": self.first_entity_stored_field["first_key"] + self.increment_value,
46+
"second_key": self.first_entity_stored_field["second_key"],
47+
"third_key": self.first_entity_stored_field["third_key"],
48+
}
49+
actual_first_entity_stored_field = first_entity.stored_field
50+
51+
expected_second_entity_stored_field = self.second_entity_stored_field
52+
actual_second_entity_stored_field = second_entity.stored_field
53+
54+
self.assertEqual(expected_first_entity_stored_field, actual_first_entity_stored_field)
55+
self.assertEqual(expected_second_entity_stored_field, actual_second_entity_stored_field)

styleguide_example/blog_examples/migrations/0002_somedatamodel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.1.6 on 2023-05-09 11:10
1+
# Generated by Django 4.1.6 on 2023-05-10 06:34
22

33
from django.db import migrations, models
44

styleguide_example/blog_examples/models.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from django.db import models
22
from django.utils import timezone
33

4+
from .f_expressions.models import SomeDataModel
5+
46

57
class TimestampsWithAuto(models.Model):
68
created_at = models.DateTimeField(auto_now_add=True)
@@ -29,13 +31,3 @@ class TimestampsOpinionated(models.Model):
2931

3032
created_at = models.DateTimeField(default=timezone.now)
3133
updated_at = models.DateTimeField(blank=True, null=True)
32-
33-
34-
class SomeDataModel(models.Model):
35-
name = models.CharField(
36-
max_length=255,
37-
blank=True,
38-
)
39-
stored_field = models.JSONField(
40-
blank=True,
41-
)

styleguide_example/blog_examples/tests/services/test_f_expressions.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)