mirror of
https://github.com/django/django.git
synced 2025-08-02 10:02:41 +00:00
Fixed #31007 -- Allowed specifying type of auto-created primary keys.
This also changes the default type of auto-created primary keys for new apps and projects to BigAutoField.
This commit is contained in:
parent
b960e4ed72
commit
b5e12d490a
28 changed files with 415 additions and 11 deletions
10
tests/check_framework/apps.py
Normal file
10
tests/check_framework/apps.py
Normal file
|
@ -0,0 +1,10 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CheckDefaultPKConfig(AppConfig):
|
||||
name = 'check_framework'
|
||||
|
||||
|
||||
class CheckPKConfig(AppConfig):
|
||||
name = 'check_framework'
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
|
@ -1,3 +1,5 @@
|
|||
from unittest import mock
|
||||
|
||||
from django.core import checks
|
||||
from django.core.checks import Error, Warning
|
||||
from django.db import models
|
||||
|
@ -358,3 +360,58 @@ class ConstraintNameTests(TestCase):
|
|||
constraints = [constraint]
|
||||
|
||||
self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [])
|
||||
|
||||
|
||||
def mocked_is_overridden(self, setting):
|
||||
# Force treating DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' as a not
|
||||
# overridden setting.
|
||||
return (
|
||||
setting != 'DEFAULT_AUTO_FIELD' or
|
||||
self.DEFAULT_AUTO_FIELD != 'django.db.models.AutoField'
|
||||
)
|
||||
|
||||
|
||||
@mock.patch('django.conf.UserSettingsHolder.is_overridden', mocked_is_overridden)
|
||||
@override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField')
|
||||
@isolate_apps('check_framework.apps.CheckDefaultPKConfig', attr_name='apps')
|
||||
@override_system_checks([checks.model_checks.check_all_models])
|
||||
class ModelDefaultAutoFieldTests(SimpleTestCase):
|
||||
def test_auto_created_pk(self):
|
||||
class Model(models.Model):
|
||||
pass
|
||||
|
||||
self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [
|
||||
Warning(
|
||||
"Auto-created primary key used when not defining a primary "
|
||||
"key type, by default 'django.db.models.AutoField'.",
|
||||
hint=(
|
||||
"Configure the DEFAULT_AUTO_FIELD setting or the "
|
||||
"CheckDefaultPKConfig.default_auto_field attribute to "
|
||||
"point to a subclass of AutoField, e.g. "
|
||||
"'django.db.models.BigAutoField'."
|
||||
),
|
||||
obj=Model,
|
||||
id='models.W042',
|
||||
),
|
||||
])
|
||||
|
||||
@override_settings(DEFAULT_AUTO_FIELD='django.db.models.BigAutoField')
|
||||
def test_default_auto_field_setting(self):
|
||||
class Model(models.Model):
|
||||
pass
|
||||
|
||||
self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
|
||||
|
||||
def test_explicit_pk(self):
|
||||
class Model(models.Model):
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
|
||||
self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
|
||||
|
||||
@isolate_apps('check_framework.apps.CheckPKConfig', kwarg_name='apps')
|
||||
def test_app_default_auto_field(self, apps):
|
||||
class ModelWithPkViaAppConfig(models.Model):
|
||||
class Meta:
|
||||
app_label = 'check_framework.apps.CheckPKConfig'
|
||||
|
||||
self.assertEqual(checks.run_checks(app_configs=apps.get_app_configs()), [])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue