From cd80a8f99d0a049e000d9218cbcac73ad35626f4 Mon Sep 17 00:00:00 2001 From: CBuiVNG Date: Tue, 25 Aug 2020 09:30:10 +0200 Subject: [PATCH 1/2] don't filter out lookup_field as input (required for update) --- graphene_django/rest_framework/mutation.py | 6 +++++- graphene_django/rest_framework/tests/test_mutation.py | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/graphene_django/rest_framework/mutation.py b/graphene_django/rest_framework/mutation.py index 592f8b3ac..0ae26766a 100644 --- a/graphene_django/rest_framework/mutation.py +++ b/graphene_django/rest_framework/mutation.py @@ -26,6 +26,7 @@ def fields_for_serializer( exclude_fields, is_input=False, convert_choices_to_enum=True, + lookup_field=None, ): fields = OrderedDict() for name, field in serializer.fields.items(): @@ -35,7 +36,8 @@ def fields_for_serializer( name in exclude_fields, field.write_only and not is_input, # don't show write_only fields in Query - field.read_only and is_input, # don't show read_only fields in Input + field.read_only and is_input + and lookup_field != name, # don't show read_only fields in Input ] ) @@ -90,6 +92,7 @@ def __init_subclass_with_meta__( exclude_fields, is_input=True, convert_choices_to_enum=convert_choices_to_enum, + lookup_field=lookup_field, ) output_fields = fields_for_serializer( serializer, @@ -97,6 +100,7 @@ def __init_subclass_with_meta__( exclude_fields, is_input=False, convert_choices_to_enum=convert_choices_to_enum, + lookup_field=lookup_field, ) _meta = SerializerMutationOptions(cls) diff --git a/graphene_django/rest_framework/tests/test_mutation.py b/graphene_django/rest_framework/tests/test_mutation.py index 1599fead3..ffbc4b570 100644 --- a/graphene_django/rest_framework/tests/test_mutation.py +++ b/graphene_django/rest_framework/tests/test_mutation.py @@ -143,17 +143,20 @@ class Meta: def test_read_only_fields(): class ReadOnlyFieldModelSerializer(serializers.ModelSerializer): + id = serializers.CharField(read_only=True) cool_name = serializers.CharField(read_only=True) class Meta: model = MyFakeModelWithPassword - fields = ["cool_name", "password"] + lookup_field = "id" + fields = ["id", "cool_name", "password"] class MyMutation(SerializerMutation): class Meta: serializer_class = ReadOnlyFieldModelSerializer assert "password" in MyMutation.Input._meta.fields + assert "id" in MyMutation.Input._meta.fields assert ( "cool_name" not in MyMutation.Input._meta.fields ), "'cool_name' is read_only field and shouldn't be on arguments" From 4a8838143e9cf735c8b32ac7bd5efb75e62c09fb Mon Sep 17 00:00:00 2001 From: CBuiVNG Date: Tue, 25 Aug 2020 09:55:30 +0200 Subject: [PATCH 2/2] flake8 formatting --- graphene_django/rest_framework/mutation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graphene_django/rest_framework/mutation.py b/graphene_django/rest_framework/mutation.py index 0ae26766a..5b42b3646 100644 --- a/graphene_django/rest_framework/mutation.py +++ b/graphene_django/rest_framework/mutation.py @@ -36,7 +36,8 @@ def fields_for_serializer( name in exclude_fields, field.write_only and not is_input, # don't show write_only fields in Query - field.read_only and is_input + field.read_only + and is_input and lookup_field != name, # don't show read_only fields in Input ] )