From 56fd6c365532194d6c111cc06faeaaaf46b4243b Mon Sep 17 00:00:00 2001 From: mahmoudmostafa0 Date: Thu, 24 Aug 2023 20:29:28 +0300 Subject: [PATCH] adding optional_fields to enforce fields to be optional --- graphene_django/rest_framework/mutation.py | 40 +++++++++++-------- .../rest_framework/serializer_converter.py | 5 ++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/graphene_django/rest_framework/mutation.py b/graphene_django/rest_framework/mutation.py index 9423d4f..eb93961 100644 --- a/graphene_django/rest_framework/mutation.py +++ b/graphene_django/rest_framework/mutation.py @@ -19,15 +19,17 @@ class SerializerMutationOptions(MutationOptions): model_class = None model_operations = ["create", "update"] serializer_class = None + optional_fields = () def fields_for_serializer( - serializer, - only_fields, - exclude_fields, - is_input=False, - convert_choices_to_enum=True, - lookup_field=None, + serializer, + only_fields, + exclude_fields, + is_input=False, + convert_choices_to_enum=True, + lookup_field=None, + optional_fields=(), ): fields = OrderedDict() for name, field in serializer.fields.items(): @@ -48,9 +50,11 @@ def fields_for_serializer( if is_not_in_only or is_excluded: continue + is_optional = name in optional_fields fields[name] = convert_serializer_field( - field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum + field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum, + force_optional=is_optional ) return fields @@ -65,16 +69,17 @@ class SerializerMutation(ClientIDMutation): @classmethod def __init_subclass_with_meta__( - cls, - lookup_field=None, - serializer_class=None, - model_class=None, - model_operations=("create", "update"), - only_fields=(), - exclude_fields=(), - convert_choices_to_enum=True, - _meta=None, - **options + cls, + lookup_field=None, + serializer_class=None, + model_class=None, + model_operations=("create", "update"), + only_fields=(), + exclude_fields=(), + convert_choices_to_enum=True, + _meta=None, + optional_fields=() + **options ): if not serializer_class: raise Exception("serializer_class is required for the SerializerMutation") @@ -98,6 +103,7 @@ class SerializerMutation(ClientIDMutation): is_input=True, convert_choices_to_enum=convert_choices_to_enum, lookup_field=lookup_field, + optional_fields=optional_fields ) output_fields = fields_for_serializer( serializer, diff --git a/graphene_django/rest_framework/serializer_converter.py b/graphene_django/rest_framework/serializer_converter.py index 328c46f..deab7d2 100644 --- a/graphene_django/rest_framework/serializer_converter.py +++ b/graphene_django/rest_framework/serializer_converter.py @@ -18,7 +18,8 @@ def get_graphene_type_from_serializer_field(field): ) -def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True): +def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True, + force_optional=False): """ Converts a django rest frameworks field to a graphql field and marks the field as required if we are creating an input type @@ -31,7 +32,7 @@ def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True) graphql_type = get_graphene_type_from_serializer_field(field) args = [] - kwargs = {"description": field.help_text, "required": is_input and field.required} + kwargs = {"description": field.help_text, "required": is_input and field.required and not force_optional} # if it is a tuple or a list it means that we are returning # the graphql type and the child type