diff --git a/CHANGELOG.md b/CHANGELOG.md index 505958e5..432f6e63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Support to Postgres fields: `DecimalRangeField`, `FloatRangeField`, `IntegerRangeField`, `BigIntegerRangeField`, `DateRangeField`, `DateTimeRangeField` [PR #80](https://github.com/model-bakers/model_bakery/pull/80) +- Support to django 3.1 `JSONField` [PR #85](https://github.com/model-bakers/model_bakery/pull/85) ### Changed - Add isort and fix imports [PR #77](https://github.com/model-bakers/model_bakery/pull/77) diff --git a/model_bakery/generators.py b/model_bakery/generators.py index 57500e11..2dc9b204 100644 --- a/model_bakery/generators.py +++ b/model_bakery/generators.py @@ -46,15 +46,20 @@ except ImportError: PositiveBigIntegerField = None +try: + from django.db.models import JSONField +except ImportError: + JSONField = None + try: from django.contrib.postgres.fields import ArrayField except ImportError: ArrayField = None try: - from django.contrib.postgres.fields import JSONField + from django.contrib.postgres.fields import JSONField as PostgresJSONField except ImportError: - JSONField = None + PostgresJSONField = None try: from django.contrib.postgres.fields import HStoreField @@ -135,6 +140,8 @@ def gen_integer(): default_mapping[ArrayField] = random_gen.gen_array if JSONField: default_mapping[JSONField] = random_gen.gen_json +if PostgresJSONField: + default_mapping[PostgresJSONField] = random_gen.gen_json if HStoreField: default_mapping[HStoreField] = random_gen.gen_hstore if CICharField: diff --git a/tests/generic/models.py b/tests/generic/models.py index 64e2fa86..b72adf28 100755 --- a/tests/generic/models.py +++ b/tests/generic/models.py @@ -89,7 +89,16 @@ class Person(models.Model): id_document = models.CharField(unique=True, max_length=10) try: - from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField + from django.models import JSONField + + data = JSONField() + except ImportError: + # Skip JSONField-related fields + pass + + try: + from django.contrib.postgres.fields import ArrayField, HStoreField + from django.contrib.postgres.fields import JSONField as PostgresJSONField from django.contrib.postgres.fields.citext import ( CICharField, CIEmailField, @@ -105,7 +114,7 @@ class Person(models.Model): if settings.USING_POSTGRES: acquaintances = ArrayField(models.IntegerField()) - data = JSONField() + postgres_data = PostgresJSONField() hstore_data = HStoreField() ci_char = CICharField(max_length=30) ci_email = CIEmailField() diff --git a/tests/test_filling_fields.py b/tests/test_filling_fields.py index baea3777..ddb49f3b 100644 --- a/tests/test_filling_fields.py +++ b/tests/test_filling_fields.py @@ -19,6 +19,11 @@ from model_bakery.random_gen import gen_related from tests.generic import generators, models +try: + from django.models import JSONField +except ImportError: + JSONField = None + try: from django.contrib.postgres.fields import ( ArrayField, @@ -26,7 +31,7 @@ CIEmailField, CITextField, HStoreField, - JSONField, + JSONField as PostgresJSONField, ) from django.contrib.postgres.fields.ranges import ( IntegerRangeField, @@ -37,7 +42,7 @@ ) except ImportError: ArrayField = None - JSONField = None + PostgresJSONField = None HStoreField = None CICharField = None CIEmailField = None @@ -164,6 +169,14 @@ def test_fill_UUIDField_with_uuid_object(self, person): assert isinstance(person.uuid, uuid.UUID) +@pytest.mark.skipif(JSONField is None, reason="JSONField could not be imported") +class TestJSONFieldsFilling: + def test_fill_JSONField_with_uuid_object(self, person): + json_field = models.Person._meta.get_field("data") + assert isinstance(json_field, JSONField) + assert isinstance(person.data, dict) + + @pytest.mark.django_db class TestFillingIntFields: def test_fill_IntegerField_with_a_random_number(self): @@ -479,7 +492,7 @@ def test_fill_arrayfield_with_empty_array(self, person): assert person.acquaintances == [] def test_fill_jsonfield_with_empty_dict(self, person): - assert person.data == {} + assert person.postgres_data == {} def test_fill_hstorefield_with_empty_dict(self, person): assert person.hstore_data == {}