Skip to content

Commit ba4c521

Browse files
committed
add system check to prohibit AutoField
1 parent 245e487 commit ba4c521

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

django_mongodb/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .query_utils import regex_match
1414
from .schema import DatabaseSchemaEditor
1515
from .utils import OperationDebugWrapper
16+
from .validation import DatabaseValidation
1617

1718

1819
class Cursor:
@@ -128,6 +129,7 @@ def _isnull_operator(a, b):
128129
features_class = DatabaseFeatures
129130
introspection_class = DatabaseIntrospection
130131
ops_class = DatabaseOperations
132+
validation_class = DatabaseValidation
131133

132134
def get_collection(self, name, **kwargs):
133135
collection = Collection(self.database, name, **kwargs)

django_mongodb/validation.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from django.core import checks
2+
from django.db.backends.base.validation import BaseDatabaseValidation
3+
4+
5+
class DatabaseValidation(BaseDatabaseValidation):
6+
prohibited_fields = {"AutoField", "BigAutoField", "SmallAutoField"}
7+
8+
def check_field_type(self, field, field_type):
9+
"""Prohibit AutoField on MongoDB."""
10+
errors = []
11+
if field.get_internal_type() in self.prohibited_fields:
12+
errors.append(
13+
checks.Error(
14+
f"{self.connection.display_name} does not support {field.__class__.__name__}.",
15+
obj=field,
16+
hint="Use django_mongodb.fields.ObjectIdAutoField instead.",
17+
id="mongodb.E001",
18+
)
19+
)
20+
return errors

tests/invalid_models_tests_/__init__.py

Whitespace-only changes.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from django.core.checks import Error
2+
from django.db import connection, models
3+
from django.test import SimpleTestCase
4+
from django.test.utils import isolate_apps
5+
6+
from django_mongodb.validation import DatabaseValidation
7+
8+
9+
@isolate_apps("invalid_models_tests")
10+
class ProhibitedFieldTests(SimpleTestCase):
11+
def test_autofield(self):
12+
class Model(models.Model):
13+
id = models.AutoField(primary_key=True)
14+
15+
field = Model._meta.get_field("id")
16+
validator = DatabaseValidation(connection=connection)
17+
self.assertEqual(
18+
validator.check_field(field),
19+
[
20+
Error(
21+
"MongoDB does not support AutoField.",
22+
hint="Use django_mongodb.fields.ObjectIdAutoField instead.",
23+
obj=field,
24+
id="mongodb.E001",
25+
)
26+
],
27+
)
28+
29+
def test_bigautofield(self):
30+
class Model(models.Model):
31+
id = models.BigAutoField(primary_key=True)
32+
33+
field = Model._meta.get_field("id")
34+
validator = DatabaseValidation(connection=connection)
35+
self.assertEqual(
36+
validator.check_field(field),
37+
[
38+
Error(
39+
"MongoDB does not support BigAutoField.",
40+
hint="Use django_mongodb.fields.ObjectIdAutoField instead.",
41+
obj=field,
42+
id="mongodb.E001",
43+
)
44+
],
45+
)
46+
47+
def test_smallautofield(self):
48+
class Model(models.Model):
49+
id = models.SmallAutoField(primary_key=True)
50+
51+
field = Model._meta.get_field("id")
52+
validator = DatabaseValidation(connection=connection)
53+
self.assertEqual(
54+
validator.check_field(field),
55+
[
56+
Error(
57+
"MongoDB does not support SmallAutoField.",
58+
hint="Use django_mongodb.fields.ObjectIdAutoField instead.",
59+
obj=field,
60+
id="mongodb.E001",
61+
)
62+
],
63+
)

0 commit comments

Comments
 (0)