mirror of https://github.com/django/django.git
Fixed #30095 -- Fixed system check for RangeField/ArrayField.choices with lists and tuples.
This commit is contained in:
parent
dc60597eb6
commit
47379d027b
|
@ -46,6 +46,10 @@ class ArrayField(CheckFieldDefaultMixin, Field):
|
|||
self.__dict__['model'] = model
|
||||
self.base_field.model = model
|
||||
|
||||
@classmethod
|
||||
def _choices_is_value(cls, value):
|
||||
return isinstance(value, (list, tuple)) or super()._choices_is_value(value)
|
||||
|
||||
def check(self, **kwargs):
|
||||
errors = super().check(**kwargs)
|
||||
if self.base_field.remote_field:
|
||||
|
|
|
@ -60,6 +60,10 @@ class RangeField(models.Field):
|
|||
self.__dict__['model'] = model
|
||||
self.base_field.model = model
|
||||
|
||||
@classmethod
|
||||
def _choices_is_value(cls, value):
|
||||
return isinstance(value, (list, tuple)) or super()._choices_is_value(value)
|
||||
|
||||
def get_prep_value(self, value):
|
||||
if value is None:
|
||||
return None
|
||||
|
|
|
@ -592,6 +592,20 @@ class TestChecks(PostgreSQLSimpleTestCase):
|
|||
self.assertEqual(errors[0].id, 'postgres.E001')
|
||||
self.assertIn('max_length', errors[0].msg)
|
||||
|
||||
def test_choices_tuple_list(self):
|
||||
class MyModel(PostgreSQLModel):
|
||||
field = ArrayField(
|
||||
models.CharField(max_length=16),
|
||||
choices=[
|
||||
[
|
||||
'Media',
|
||||
[(['vinyl', 'cd'], 'Audio'), (('vhs', 'dvd'), 'Video')],
|
||||
],
|
||||
(['mp3', 'mp4'], 'Digital'),
|
||||
],
|
||||
)
|
||||
self.assertEqual(MyModel._meta.get_field('field').check(), [])
|
||||
|
||||
|
||||
@unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific tests")
|
||||
class TestMigrations(TransactionTestCase):
|
||||
|
|
|
@ -10,7 +10,7 @@ from django.test import override_settings
|
|||
from django.utils import timezone
|
||||
|
||||
from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
|
||||
from .models import RangeLookupsModel, RangesModel
|
||||
from .models import PostgreSQLModel, RangeLookupsModel, RangesModel
|
||||
|
||||
try:
|
||||
from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange
|
||||
|
@ -413,6 +413,18 @@ class TestSerialization(PostgreSQLSimpleTestCase):
|
|||
self.assertEqual(new_instance.ints, NumericRange(10, None))
|
||||
|
||||
|
||||
class TestChecks(PostgreSQLSimpleTestCase):
|
||||
def test_choices_tuple_list(self):
|
||||
class Model(PostgreSQLModel):
|
||||
field = pg_fields.IntegerRangeField(
|
||||
choices=[
|
||||
['1-50', [((1, 25), '1-25'), ([26, 50], '26-50')]],
|
||||
((51, 100), '51-100'),
|
||||
],
|
||||
)
|
||||
self.assertEqual(Model._meta.get_field('field').check(), [])
|
||||
|
||||
|
||||
class TestValidators(PostgreSQLSimpleTestCase):
|
||||
|
||||
def test_max(self):
|
||||
|
|
Loading…
Reference in New Issue