|
2 | 2 | from datetime import timedelta
|
3 | 3 |
|
4 | 4 | from django.core.exceptions import FieldDoesNotExist, ValidationError
|
5 |
| -from django.db import models |
| 5 | +from django.db import connection, models |
6 | 6 | from django.db.models import (
|
7 | 7 | Exists,
|
8 | 8 | ExpressionWrapper,
|
|
17 | 17 | from django_mongodb_backend.fields import EmbeddedModelField
|
18 | 18 | from django_mongodb_backend.models import EmbeddedModel
|
19 | 19 |
|
20 |
| -from .models import ( |
21 |
| - Address, |
22 |
| - Author, |
23 |
| - Book, |
24 |
| - Data, |
25 |
| - Holder, |
26 |
| - Library, |
27 |
| -) |
| 20 | +from .models import A, Address, Author, B, Book, C, D, Data, E, Holder, Library |
28 | 21 | from .utils import truncate_ms
|
29 | 22 |
|
30 | 23 |
|
@@ -117,6 +110,66 @@ def test_order_by_embedded_field(self):
|
117 | 110 | qs = Holder.objects.filter(data__integer__gt=3).order_by("-data__integer")
|
118 | 111 | self.assertSequenceEqual(qs, list(reversed(self.objs[4:])))
|
119 | 112 |
|
| 113 | + def test_exact_with_model(self): |
| 114 | + data = Holder.objects.first().data |
| 115 | + self.assertEqual( |
| 116 | + Holder.objects.filter(data=data).get().data.integer, self.objs[0].data.integer |
| 117 | + ) |
| 118 | + |
| 119 | + def test_exact_with_model_ignores_key_order(self): |
| 120 | + # Due to the possibility of schema changes or the reordering of a |
| 121 | + # model's fields, a lookup must work if an embedded document has its |
| 122 | + # keys in a different order than what's declared on the embedded model. |
| 123 | + connection.get_collection("model_fields__holder").insert_one( |
| 124 | + { |
| 125 | + "data": { |
| 126 | + "auto_now": None, |
| 127 | + "auto_now_add": None, |
| 128 | + "json_value": None, |
| 129 | + "integer": 100, |
| 130 | + } |
| 131 | + } |
| 132 | + ) |
| 133 | + self.assertEqual(Holder.objects.filter(data=Data(integer=100)).get().data.integer, 100) |
| 134 | + |
| 135 | + def test_exact_with_nested_model(self): |
| 136 | + address = Address(city="NYC", state="NY") |
| 137 | + author = Author(name="Shakespeare", age=55, address=address) |
| 138 | + obj = Book.objects.create(author=author) |
| 139 | + self.assertCountEqual(Book.objects.filter(author=author), [obj]) |
| 140 | + self.assertCountEqual(Book.objects.filter(author__address=address), [obj]) |
| 141 | + |
| 142 | + def test_exact_with_deeply_nested_models(self): |
| 143 | + e1 = E(name="E1", value=5) |
| 144 | + d1 = D(name="D1", value=4, e=e1) |
| 145 | + c1 = C(name="C1", value=3, d=d1) |
| 146 | + b1 = B(name="B1", value=2, c=c1) |
| 147 | + a1 = A.objects.create(b=b1) |
| 148 | + e2 = E(name="E2", value=6) |
| 149 | + d2 = D(name="D2", value=4, e=e1, nullable_e=e2) |
| 150 | + c2 = C(name="C2", value=3, d=d2) |
| 151 | + b2 = B(name="B2", value=2, c=c2) |
| 152 | + a2 = A.objects.create(b=b2) |
| 153 | + self.assertCountEqual(A.objects.filter(b=b1), [a1]) |
| 154 | + self.assertCountEqual(A.objects.filter(b__c=c1), [a1]) |
| 155 | + self.assertCountEqual(A.objects.filter(b__c__d=d1), [a1]) |
| 156 | + self.assertCountEqual(A.objects.filter(b__c__d__e=e1), [a1, a2]) |
| 157 | + self.assertCountEqual(A.objects.filter(b=b2), [a2]) |
| 158 | + self.assertCountEqual(A.objects.filter(b__c=c2), [a2]) |
| 159 | + self.assertCountEqual(A.objects.filter(b__c__d=d2), [a2]) |
| 160 | + self.assertCountEqual(A.objects.filter(b__c__d__nullable_e=e2), [a2]) |
| 161 | + |
| 162 | + def test_exact_validates_argument(self): |
| 163 | + msg = "An EmbeddedModelField must be queried using a model instance, got <class 'dict'>." |
| 164 | + with self.assertRaisesMessage(TypeError, msg): |
| 165 | + str(A.objects.filter(b={})) |
| 166 | + with self.assertRaisesMessage(TypeError, msg): |
| 167 | + str(A.objects.filter(b__c={})) |
| 168 | + with self.assertRaisesMessage(TypeError, msg): |
| 169 | + str(A.objects.filter(b__c__d={})) |
| 170 | + with self.assertRaisesMessage(TypeError, msg): |
| 171 | + str(A.objects.filter(b__c__d__e={})) |
| 172 | + |
120 | 173 | def test_embedded_json_field_lookups(self):
|
121 | 174 | objs = [
|
122 | 175 | Holder.objects.create(
|
|
0 commit comments