diff --git a/graphene_django/converter.py b/graphene_django/converter.py index c40313d..3b44094 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -61,6 +61,14 @@ def convert_django_field_with_choices(field, registry=None): if choices: meta = field.model._meta name = to_camel_case("{}_{}".format(meta.object_name, field.name)) + # Not null fields with choices and blank=True and without default value + if ( + field.blank and + not field.null and + field.default == models.fields.NOT_PROVIDED + ): + choices = list(choices) + choices.append(('', '')) choices = list(get_choices(choices)) named_choices = [(c[0], c[1]) for c in choices] named_choices_descriptions = {c[0]: c[2] for c in choices} @@ -71,7 +79,8 @@ def convert_django_field_with_choices(field, registry=None): return named_choices_descriptions[self.name] enum = Enum(name, list(named_choices), type=EnumWithDescriptionsType) - converted = enum(description=field.help_text, required=not field.null) + required = not (field.blank or field.null or field.default) + converted = enum(description=field.help_text, required=required) else: converted = convert_django_field(field, registry) if registry is not None: diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 4fe546d..95bbdec 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -38,7 +38,7 @@ class Reporter(models.Model): last_name = models.CharField(max_length=30) email = models.EmailField() pets = models.ManyToManyField("self") - a_choice = models.CharField(max_length=30, choices=CHOICES) + a_choice = models.CharField(max_length=30, choices=CHOICES, blank=True) objects = models.Manager() doe_objects = DoeReporterManager() diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 8a8643b..26f4fa3 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -120,7 +120,7 @@ type Article implements Node { pubDateTime: DateTime! reporter: Reporter! editor: Reporter! - lang: ArticleLang! + lang: ArticleLang importance: ArticleImportance } @@ -166,7 +166,7 @@ type Reporter { lastName: String! email: String! pets: [Reporter] - aChoice: ReporterAChoice! + aChoice: ReporterAChoice reporterType: ReporterReporterType articles(before: String, after: String, first: Int, last: Int): ArticleConnection } @@ -174,6 +174,7 @@ type Reporter { enum ReporterAChoice { A_1 A_2 + A_ } enum ReporterReporterType {