diff --git a/docs/authorization.rst b/docs/authorization.rst index 8ef05b48c..387ad299f 100644 --- a/docs/authorization.rst +++ b/docs/authorization.rst @@ -111,6 +111,7 @@ If you are using ``DjangoObjectType`` you can define a custom `get_queryset`. class PostNode(DjangoObjectType): class Meta: model = Post + fields = '__all__' @classmethod def get_queryset(cls, queryset, info): diff --git a/docs/filtering.rst b/docs/filtering.rst index a511c6459..9fff8ebcf 100644 --- a/docs/filtering.rst +++ b/docs/filtering.rst @@ -45,6 +45,7 @@ For example: class Meta: # Assume you have an Animal model defined with the following fields model = Animal + fields = '__all__' filter_fields = ['name', 'genus', 'is_domesticated'] interfaces = (relay.Node, ) @@ -75,6 +76,7 @@ You can also make more complex lookup types available: class AnimalNode(DjangoObjectType): class Meta: model = Animal + fields = '__all__' # Provide more complex lookup types filter_fields = { 'name': ['exact', 'icontains', 'istartswith'], @@ -116,6 +118,7 @@ create your own ``FilterSet``. You can pass it directly as follows: class Meta: # Assume you have an Animal model defined with the following fields model = Animal + fields = '__all__' filter_fields = ['name', 'genus', 'is_domesticated'] interfaces = (relay.Node, ) @@ -179,6 +182,7 @@ in unison with the ``filter_fields`` parameter: class AnimalNode(DjangoObjectType): class Meta: model = Animal + fields = '__all__' filterset_class = AnimalFilter interfaces = (relay.Node, ) @@ -236,6 +240,7 @@ Extend the tuple of fields if you want to order by more than one field. class Meta: name = 'Group' model = GroupModel + fields = '__all__' interfaces = (relay.Node,) def resolve_users(self, info, **kwargs): diff --git a/docs/mutations.rst b/docs/mutations.rst index aef32eb50..306932224 100644 --- a/docs/mutations.rst +++ b/docs/mutations.rst @@ -25,6 +25,7 @@ Simple example class QuestionType(DjangoObjectType): class Meta: model = Question + fields = '__all__' class QuestionMutation(graphene.Mutation): @@ -90,6 +91,7 @@ DjangoModelFormMutation class PetType(DjangoObjectType): class Meta: model = Pet + fields = '__all__' class PetMutation(DjangoModelFormMutation): pet = Field(PetType) diff --git a/docs/queries.rst b/docs/queries.rst index 4b3f71802..0ec8b6524 100644 --- a/docs/queries.rst +++ b/docs/queries.rst @@ -28,6 +28,7 @@ Full example class QuestionType(DjangoObjectType): class Meta: model = Question + fields = '__all__' class Query: @@ -53,6 +54,9 @@ all fields that should be exposed using the fields attribute. This will make it less likely to result in unintentionally exposing data when your models change. +Setting neither ``fields`` nor ``exclude`` is deprecated and will raise a warning, you should at least explicitly make +``DjangoObjectType`` include all fields in the model as described below. + ``fields`` ~~~~~~~~~~ @@ -127,6 +131,7 @@ For example the following ``Model`` and ``DjangoObjectType``: class Pet(DjangoObjectType): class Meta: model = PetModel + fields = '__all__' Results in the following GraphQL schema definition: @@ -151,6 +156,7 @@ You can disable this automatic conversion by setting class Pet(DjangoObjectType): class Meta: model = PetModel + fields = '__all__' convert_choices_to_enum = False .. code:: @@ -168,6 +174,7 @@ automatically converted into enums: class Pet(DjangoObjectType): class Meta: model = PetModel + fields = '__all__' convert_choices_to_enum = ['kind'] **Note:** Setting ``convert_choices_to_enum = []`` is the same as setting it to @@ -206,6 +213,7 @@ need to create the most basic class for this to work: class CategoryType(DjangoObjectType): class Meta: model = Category + fields = '__all__' .. _django-objecttype-get-queryset: @@ -224,6 +232,7 @@ Use this to control filtering on the ObjectType level instead of the Query objec class QuestionType(DjangoObjectType): class Meta: model = Question + fields = '__all__' @classmethod def get_queryset(cls, queryset, info): @@ -347,6 +356,7 @@ the core graphene pages for more information on customizing the Relay experience class QuestionType(DjangoObjectType): class Meta: model = Question + fields = '__all__' interfaces = (relay.Node,) diff --git a/docs/schema.py b/docs/schema.py index 3d9b2fa90..1de92edf1 100644 --- a/docs/schema.py +++ b/docs/schema.py @@ -8,11 +8,13 @@ class CategoryType(DjangoObjectType): class Meta: model = Category + fields = '__all__' class IngredientType(DjangoObjectType): class Meta: model = Ingredient + fields = '__all__' class Query(object): diff --git a/docs/tutorial-plain.rst b/docs/tutorial-plain.rst index e80f9ab9a..0547adacb 100644 --- a/docs/tutorial-plain.rst +++ b/docs/tutorial-plain.rst @@ -157,11 +157,13 @@ Create ``cookbook/ingredients/schema.py`` and type the following: class CategoryType(DjangoObjectType): class Meta: model = Category + fields = '__all__' class IngredientType(DjangoObjectType): class Meta: model = Ingredient + fields = '__all__' class Query(object): diff --git a/docs/tutorial-relay.rst b/docs/tutorial-relay.rst index e900ea1a7..4baba8be5 100644 --- a/docs/tutorial-relay.rst +++ b/docs/tutorial-relay.rst @@ -130,6 +130,7 @@ Create ``cookbook/ingredients/schema.py`` and type the following: class CategoryNode(DjangoObjectType): class Meta: model = Category + fields = '__all__' filter_fields = ['name', 'ingredients'] interfaces = (relay.Node, ) @@ -137,6 +138,7 @@ Create ``cookbook/ingredients/schema.py`` and type the following: class IngredientNode(DjangoObjectType): class Meta: model = Ingredient + fields = '__all__' # Allow for some more advanced filtering here filter_fields = { 'name': ['exact', 'icontains', 'istartswith'], diff --git a/examples/cookbook-plain/cookbook/ingredients/schema.py b/examples/cookbook-plain/cookbook/ingredients/schema.py index 1a54c4be4..24a5e9530 100644 --- a/examples/cookbook-plain/cookbook/ingredients/schema.py +++ b/examples/cookbook-plain/cookbook/ingredients/schema.py @@ -7,11 +7,13 @@ class CategoryType(DjangoObjectType): class Meta: model = Category + fields = "__all__" class IngredientType(DjangoObjectType): class Meta: model = Ingredient + fields = "__all__" class Query(object): diff --git a/examples/cookbook-plain/cookbook/recipes/schema.py b/examples/cookbook-plain/cookbook/recipes/schema.py index b029570ca..aa7fd2df0 100644 --- a/examples/cookbook-plain/cookbook/recipes/schema.py +++ b/examples/cookbook-plain/cookbook/recipes/schema.py @@ -7,11 +7,13 @@ class RecipeType(DjangoObjectType): class Meta: model = Recipe + fields = "__all__" class RecipeIngredientType(DjangoObjectType): class Meta: model = RecipeIngredient + fields = "__all__" class Query(object): diff --git a/examples/cookbook/cookbook/ingredients/schema.py b/examples/cookbook/cookbook/ingredients/schema.py index 5e5da80fe..43b6118a0 100644 --- a/examples/cookbook/cookbook/ingredients/schema.py +++ b/examples/cookbook/cookbook/ingredients/schema.py @@ -10,6 +10,7 @@ class CategoryNode(DjangoObjectType): class Meta: model = Category interfaces = (Node,) + fields = "__all__" filter_fields = ["name", "ingredients"] @@ -18,6 +19,7 @@ class Meta: model = Ingredient # Allow for some more advanced filtering here interfaces = (Node,) + fields = "__all__" filter_fields = { "name": ["exact", "icontains", "istartswith"], "notes": ["exact", "icontains"], diff --git a/examples/cookbook/cookbook/recipes/schema.py b/examples/cookbook/cookbook/recipes/schema.py index fbbedd8ac..c7298aacd 100644 --- a/examples/cookbook/cookbook/recipes/schema.py +++ b/examples/cookbook/cookbook/recipes/schema.py @@ -8,6 +8,7 @@ class RecipeNode(DjangoObjectType): class Meta: model = Recipe interfaces = (Node,) + fields = "__all__" filter_fields = ["title", "amounts"] @@ -16,6 +17,7 @@ class Meta: model = RecipeIngredient # Allow for some more advanced filtering here interfaces = (Node,) + fields = "__all__" filter_fields = { "ingredient__name": ["exact", "icontains", "istartswith"], "recipe": ["exact"], diff --git a/examples/starwars/schema.py b/examples/starwars/schema.py index fb2284075..4bc26e937 100644 --- a/examples/starwars/schema.py +++ b/examples/starwars/schema.py @@ -12,6 +12,7 @@ class Ship(DjangoObjectType): class Meta: model = ShipModel interfaces = (relay.Node,) + fields = "__all__" @classmethod def get_node(cls, info, id): @@ -22,12 +23,14 @@ def get_node(cls, info, id): class Character(DjangoObjectType): class Meta: model = CharacterModel + fields = "__all__" class Faction(DjangoObjectType): class Meta: model = FactionModel interfaces = (relay.Node,) + fields = "__all__" @classmethod def get_node(cls, info, id): diff --git a/graphene_django/debug/tests/test_query.py b/graphene_django/debug/tests/test_query.py index 7255ec69e..fcfcd7176 100644 --- a/graphene_django/debug/tests/test_query.py +++ b/graphene_django/debug/tests/test_query.py @@ -21,6 +21,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): reporter = graphene.Field(ReporterType) @@ -65,6 +66,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): reporter = graphene.Field(ReporterType) @@ -130,6 +132,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = graphene.List(ReporterType) @@ -172,6 +175,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -220,6 +224,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoFilterConnectionField(ReporterType, fields=["last_name"]) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 59cc30b39..1e36a9a83 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -41,17 +41,20 @@ class ArticleNode(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ("headline",) class ReporterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class PetNode(DjangoObjectType): class Meta: model = Pet interfaces = (Node,) + fields = "__all__" def get_args(field): @@ -189,6 +192,7 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = ["first_name", "articles"] field = DjangoFilterConnectionField(ReporterFilterNode) @@ -201,12 +205,14 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = ["first_name", "articles"] class ArticleFilterNode(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ["headline", "reporter"] class Query(ObjectType): @@ -233,6 +239,7 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filterset_class = ReporterFilter filter_fields = ["first_name", "articles"] @@ -247,6 +254,7 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filterset_class = ReporterFilter field = DjangoFilterConnectionField(ReporterFilterNode) @@ -269,12 +277,14 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filterset_class = ReporterFilter class ArticleFilterNode(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filterset_class = ArticleFilter class Query(ObjectType): @@ -294,12 +304,14 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = ["first_name", "articles"] class ArticleFilterNode(DjangoObjectType): class Meta: interfaces = (Node,) model = Article + fields = "__all__" filter_fields = ["headline", "reporter"] class Query(ObjectType): @@ -451,6 +463,7 @@ class ReporterFilterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = {"first_name": ["icontains"]} class Query(ObjectType): @@ -496,6 +509,7 @@ def resolve_child_reporters(self, **args): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(ObjectType): all_reporters = DjangoFilterConnectionField(ReporterFilterNode) @@ -521,11 +535,13 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class ArticleType(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ("lang",) class Query(ObjectType): @@ -610,6 +626,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = () class Query(ObjectType): @@ -676,6 +693,7 @@ def resolve_full_name(instance, info, **args): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = () class Query(ObjectType): @@ -718,6 +736,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = () class Query(ObjectType): @@ -758,6 +777,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" filter_fields = () @classmethod @@ -956,6 +976,7 @@ class NewReporterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class NewArticleFilterNode(DjangoObjectType): viewer = Field(NewReporterNode) @@ -963,6 +984,7 @@ class NewArticleFilterNode(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filterset_class = NewArticleFilter def resolve_viewer(self, info): diff --git a/graphene_django/rest_framework/tests/test_multiple_model_serializers.py b/graphene_django/rest_framework/tests/test_multiple_model_serializers.py index 1676b622d..0332b3c5e 100644 --- a/graphene_django/rest_framework/tests/test_multiple_model_serializers.py +++ b/graphene_django/rest_framework/tests/test_multiple_model_serializers.py @@ -27,12 +27,14 @@ class ParentType(DjangoObjectType): class Meta: model = MyFakeParentModel interfaces = (graphene.relay.Node,) + fields = "__all__" class ChildType(DjangoObjectType): class Meta: model = MyFakeChildModel interfaces = (graphene.relay.Node,) + fields = "__all__" class MyModelChildSerializer(serializers.ModelSerializer): diff --git a/graphene_django/rest_framework/tests/test_mutation.py b/graphene_django/rest_framework/tests/test_mutation.py index 1b31e3689..63285b29e 100644 --- a/graphene_django/rest_framework/tests/test_mutation.py +++ b/graphene_django/rest_framework/tests/test_mutation.py @@ -165,6 +165,7 @@ def test_nested_model(): class MyFakeModelGrapheneType(DjangoObjectType): class Meta: model = MyFakeModel + fields = "__all__" class MyMutation(SerializerMutation): class Meta: diff --git a/graphene_django/tests/schema.py b/graphene_django/tests/schema.py index d0d9e4700..757ef389c 100644 --- a/graphene_django/tests/schema.py +++ b/graphene_django/tests/schema.py @@ -9,6 +9,7 @@ class Character(DjangoObjectType): class Meta: model = Reporter interfaces = (relay.Node,) + fields = "__all__" def get_node(self, info, id): pass @@ -20,6 +21,7 @@ class Human(DjangoObjectType): class Meta: model = Article interfaces = (relay.Node,) + fields = "__all__" def resolve_raises(self, info): raise Exception("This field should raise exception") diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index 7340fb4ea..d31d6f5e7 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -245,6 +245,7 @@ def test_should_manytomany_convert_connectionorlist_list(): class A(DjangoObjectType): class Meta: model = Reporter + fields = "__all__" graphene_field = convert_django_field( Reporter._meta.local_many_to_many[0], A._meta.registry @@ -265,6 +266,7 @@ class A(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" graphene_field = convert_django_field( Reporter._meta.local_many_to_many[0], A._meta.registry @@ -279,6 +281,7 @@ def test_should_manytoone_convert_connectionorlist(): class A(DjangoObjectType): class Meta: model = Article + fields = "__all__" graphene_field = convert_django_field(Reporter.articles.rel, A._meta.registry) assert isinstance(graphene_field, graphene.Dynamic) @@ -295,6 +298,7 @@ def test_should_onetoone_reverse_convert_model(): class A(DjangoObjectType): class Meta: model = FilmDetails + fields = "__all__" graphene_field = convert_django_field(Film.details.related, A._meta.registry) assert isinstance(graphene_field, graphene.Dynamic) diff --git a/graphene_django/tests/test_query.py b/graphene_django/tests/test_query.py index f7f7c4edd..ad5323074 100644 --- a/graphene_django/tests/test_query.py +++ b/graphene_django/tests/test_query.py @@ -89,6 +89,7 @@ def test_should_query_well(): class ReporterType(DjangoObjectType): class Meta: model = Reporter + fields = "__all__" class Query(graphene.ObjectType): reporter = graphene.Field(ReporterType) @@ -130,6 +131,7 @@ class Event(models.Model): class EventType(DjangoObjectType): class Meta: model = Event + fields = "__all__" class Query(graphene.ObjectType): event = graphene.Field(EventType) @@ -171,6 +173,7 @@ class ReporterNode(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" @classmethod def get_node(cls, info, id): @@ -183,6 +186,7 @@ class ArticleNode(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" @classmethod def get_node(cls, info, id): @@ -253,11 +257,13 @@ class FilmNode(DjangoObjectType): class Meta: model = Film interfaces = (Node,) + fields = "__all__" class FilmDetailsNode(DjangoObjectType): class Meta: model = FilmDetails interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): film = graphene.Field(FilmNode) @@ -352,6 +358,7 @@ class ArticleType(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ("lang",) class Query(graphene.ObjectType): @@ -405,11 +412,13 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class ArticleType(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ("lang",) class Query(graphene.ObjectType): @@ -483,6 +492,7 @@ class FilmType(DjangoObjectType): class Meta: model = Film interfaces = (Node,) + fields = "__all__" filter_fields = ("genre",) class Query(graphene.ObjectType): @@ -527,11 +537,13 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class ArticleType(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" filter_fields = ("lang", "headline") class Query(graphene.ObjectType): @@ -612,6 +624,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -651,6 +664,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -692,6 +706,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -733,6 +748,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -770,6 +786,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType) @@ -811,6 +828,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" class Query(graphene.ObjectType): all_reporters = DjangoConnectionField(ReporterType, on="doe_objects") @@ -857,12 +875,14 @@ class ArticleType(DjangoObjectType): class Meta: model = Article interfaces = (Node,) + fields = "__all__" class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) use_connection = True + fields = "__all__" articles = DjangoConnectionField(ArticleType) @@ -947,10 +967,12 @@ class Meta: class BaseType(DjangoObjectType): class Meta: model = BaseModel + fields = "__all__" class ChildType(DjangoObjectType): class Meta: model = ChildModel + fields = "__all__" class Query(graphene.ObjectType): base = graphene.Field(BaseType) @@ -978,12 +1000,14 @@ class Meta: model = Reporter interfaces = (Node,) use_connection = True + fields = "__all__" class CNNReporterType(DjangoObjectType): class Meta: model = CNNReporter interfaces = (Node,) use_connection = True + fields = "__all__" reporter = Reporter.objects.create( first_name="John", last_name="Doe", email="johndoe@example.com", a_choice=1 @@ -1056,6 +1080,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (Node,) + fields = "__all__" @classmethod def get_queryset(cls, queryset, info): @@ -1089,6 +1114,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (graphene.relay.Node,) + fields = "__all__" class FilmType(DjangoObjectType): reporters = DjangoConnectionField(ReporterType) @@ -1096,6 +1122,7 @@ class FilmType(DjangoObjectType): class Meta: model = Film interfaces = (graphene.relay.Node,) + fields = "__all__" class Query(graphene.ObjectType): films = DjangoConnectionField(FilmType) @@ -1141,6 +1168,7 @@ class ReporterType(DjangoObjectType): class Meta: model = Reporter interfaces = (graphene.relay.Node,) + fields = "__all__" class FilmType(DjangoObjectType): reporters = DjangoConnectionField(ReporterType) @@ -1149,6 +1177,7 @@ class FilmType(DjangoObjectType): class Meta: model = Film interfaces = (graphene.relay.Node,) + fields = "__all__" class Query(graphene.ObjectType): films = DjangoConnectionField(FilmType) diff --git a/graphene_django/tests/test_schema.py b/graphene_django/tests/test_schema.py index 2c2f74b67..1c889f11c 100644 --- a/graphene_django/tests/test_schema.py +++ b/graphene_django/tests/test_schema.py @@ -9,7 +9,7 @@ def test_should_raise_if_no_model(): with raises(Exception) as excinfo: class Character1(DjangoObjectType): - pass + fields = "__all__" assert "valid Django Model" in str(excinfo.value) @@ -20,6 +20,7 @@ def test_should_raise_if_model_is_invalid(): class Character2(DjangoObjectType): class Meta: model = 1 + fields = "__all__" assert "valid Django Model" in str(excinfo.value) @@ -29,6 +30,7 @@ class ReporterType2(DjangoObjectType): class Meta: model = Reporter registry = Registry() + fields = "__all__" fields = list(ReporterType2._meta.fields.keys()) assert fields[:-2] == [ diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 1986568c7..a62c4c9c0 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -19,6 +19,7 @@ class Reporter(DjangoObjectType): class Meta: model = ReporterModel + fields = "__all__" class ArticleConnection(Connection): @@ -40,6 +41,7 @@ class Meta: model = ArticleModel interfaces = (Node,) connection_class = ArticleConnection + fields = "__all__" class RootQuery(ObjectType): @@ -106,6 +108,7 @@ def __init_subclass_with_meta__(cls, **options): class Article(ArticleType): class Meta: model = ArticleModel + fields = "__all__" assert isinstance(Article._meta, ArticleTypeOptions) @@ -476,6 +479,37 @@ class Meta: assert len(record) == 0 +@with_local_registry +def test_django_objecttype_neither_fields_nor_exclude(): + with pytest.warns( + DeprecationWarning, + match=r"Creating a DjangoObjectType without either the `fields` " + "or the `exclude` option is deprecated.", + ): + + class Reporter(DjangoObjectType): + class Meta: + model = ReporterModel + + with pytest.warns(None) as record: + + class Reporter2(DjangoObjectType): + class Meta: + model = ReporterModel + fields = ["email"] + + assert len(record) == 0 + + with pytest.warns(None) as record: + + class Reporter3(DjangoObjectType): + class Meta: + model = ReporterModel + exclude = ["email"] + + assert len(record) == 0 + + def custom_enum_name(field): return "CustomEnum{}".format(field.name.title()) @@ -500,6 +534,7 @@ class Pet(DjangoObjectType): class Meta: model = PetModel convert_choices_to_enum = False + fields = "__all__" class Query(ObjectType): pet = Field(Pet) @@ -530,6 +565,7 @@ class Pet(DjangoObjectType): class Meta: model = PetModel convert_choices_to_enum = ["kind"] + fields = "__all__" class Query(ObjectType): pet = Field(Pet) @@ -569,6 +605,7 @@ class Pet(DjangoObjectType): class Meta: model = PetModel convert_choices_to_enum = [] + fields = "__all__" class Query(ObjectType): pet = Field(Pet) diff --git a/graphene_django/types.py b/graphene_django/types.py index f3894213e..7d144433b 100644 --- a/graphene_django/types.py +++ b/graphene_django/types.py @@ -220,6 +220,16 @@ def __init_subclass_with_meta__( % type(exclude).__name__ ) + if fields is None and exclude is None: + warnings.warn( + "Creating a DjangoObjectType without either the `fields` " + "or the `exclude` option is deprecated. Add an explicit `fields " + "= '__all__'` option on DjangoObjectType {class_name} to use all " + "fields".format(class_name=cls.__name__,), + DeprecationWarning, + stacklevel=2, + ) + django_fields = yank_fields_from_attrs( construct_fields(model, registry, fields, exclude, convert_choices_to_enum), _as=Field,