Graphene-Django 文件命名约定
Graphene-Django Filenaming Conventions
我正在重建一个以前的 Django REST API 项目作为 GraphQL 项目。我现在的查询和突变工作正常。
我的大部分学习来自查看现有的 Graphene-Django 和 Graphene-Python 代码示例。他们之间似乎有很多不一致之处。
有人建议将 GraphQL 查询放在 schema.py
而突变应该放在 mutation.py
.
我认为更有意义的是让这两个文件保存各自的代码:
- queries.py
- mutations.py
虽然我对 Django 和 Python 比较陌生,但我想确保我没有违反任何约定。
对你的想法感兴趣!
罗伯特
目前还没有任何约定,因为 GraphQL 是 REST 的 fairly new 替代方法。因此,"conventions"是在我们说话的那一刻创建的。
但是,由于 schema
是通用定义的术语,您可以将其重命名为 queries
。
这是我的项目结构:
django_proj/
manage.py
requirements.txt
my_app/
__init__.py
migrations/
admin.py
schema/
__init__.py
schema.py # holds the class Query. The GraphQL endpoints, if you like
types.py # holds the DjangoObjectType classes
inputs.py # holds the graphene.InputObjectType classes (for defining input to a query or mutation)
mutations.py # holds the mutations (what else?!)
因此,如果您愿意,可以将 schema.py
(__init__
) 重命名为 queries.py
。这两个词没有太大的区别。
我非常喜欢 nik_m 的回答,因此我编写了一些代码来从 Django shell 内部生成模板结构。当我一遍又一遍地创建这些文件时,我想强制执行一些一致性。我将代码放在这里以防其他人发现它有用。
import os
from django.conf import settings
def schema_setup(app_name):
"""
Sets up a default schema file structure.
"""
SCHEMA_DIRECTORY_NAME = 'schema'
app_directory = os.path.join(settings.PROJECT_DIR, app_name)
if not os.path.exists(app_directory):
raise Exception("Can't find app directory {}".format(app_directory))
schema_directory = os.path.join(app_directory, SCHEMA_DIRECTORY_NAME)
if os.path.exists(schema_directory):
raise Exception("Schema directory {} already exists.".format(schema_directory))
os.makedirs(schema_directory)
mutation_class = "{}Mutation".format(app_name.title())
query_class = "{}Query".format(app_name.title())
init_txt = "from .mutations import {}\nfrom .queries import {}\n".format(mutation_class, query_class)
fields_txt = "# Insert common fields here.\nimport graphene\n"
inputs_txt = "# Insert graphene.InputObjectType classes.\nimport graphene\n"
mutations_txt = "# Insert graphql mutations here.\nimport graphene\n\nclass {}(graphene.AbstractType):\n pass\n".format(mutation_class)
queries_txt = "# Insert graphql queries here.\nimport graphene\n\nclass {}(graphene.AbstractType):\n pass\n".format(query_class)
types_txt = "# Insert DjangoObjectType classes here.\nimport graphene\nfrom graphene_django.types import DjangoObjectType\n"
for fname, file_text in [("__init__.py", init_txt),
("fields.py", fields_txt),
("inputs.py", inputs_txt),
("mutations.py", mutations_txt),
("queries.py", queries_txt),
("types.py", types_txt),
]:
with open(os.path.join(schema_directory, fname), "w") as output_file:
output_file.write(file_text)
print("Created {}".format(fname))
来自 Django 内部 shell,运行 喜欢 schema_setup("my_app")
注:
- 这假设您在
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
等设置中设置了 PROJECT_DIR
- 在您的顶级架构中,导入
from my_app.schema import MyAppQuery, MyAppMutation
- 我在 "query" 与 "queries" 和 "mutation" 与 "mutations" 之间来回切换——截至目前,石墨烯文档还没有一致
我正在重建一个以前的 Django REST API 项目作为 GraphQL 项目。我现在的查询和突变工作正常。
我的大部分学习来自查看现有的 Graphene-Django 和 Graphene-Python 代码示例。他们之间似乎有很多不一致之处。
有人建议将 GraphQL 查询放在 schema.py
而突变应该放在 mutation.py
.
我认为更有意义的是让这两个文件保存各自的代码: - queries.py - mutations.py
虽然我对 Django 和 Python 比较陌生,但我想确保我没有违反任何约定。
对你的想法感兴趣!
罗伯特
目前还没有任何约定,因为 GraphQL 是 REST 的 fairly new 替代方法。因此,"conventions"是在我们说话的那一刻创建的。
但是,由于 schema
是通用定义的术语,您可以将其重命名为 queries
。
这是我的项目结构:
django_proj/
manage.py
requirements.txt
my_app/
__init__.py
migrations/
admin.py
schema/
__init__.py
schema.py # holds the class Query. The GraphQL endpoints, if you like
types.py # holds the DjangoObjectType classes
inputs.py # holds the graphene.InputObjectType classes (for defining input to a query or mutation)
mutations.py # holds the mutations (what else?!)
因此,如果您愿意,可以将 schema.py
(__init__
) 重命名为 queries.py
。这两个词没有太大的区别。
我非常喜欢 nik_m 的回答,因此我编写了一些代码来从 Django shell 内部生成模板结构。当我一遍又一遍地创建这些文件时,我想强制执行一些一致性。我将代码放在这里以防其他人发现它有用。
import os
from django.conf import settings
def schema_setup(app_name):
"""
Sets up a default schema file structure.
"""
SCHEMA_DIRECTORY_NAME = 'schema'
app_directory = os.path.join(settings.PROJECT_DIR, app_name)
if not os.path.exists(app_directory):
raise Exception("Can't find app directory {}".format(app_directory))
schema_directory = os.path.join(app_directory, SCHEMA_DIRECTORY_NAME)
if os.path.exists(schema_directory):
raise Exception("Schema directory {} already exists.".format(schema_directory))
os.makedirs(schema_directory)
mutation_class = "{}Mutation".format(app_name.title())
query_class = "{}Query".format(app_name.title())
init_txt = "from .mutations import {}\nfrom .queries import {}\n".format(mutation_class, query_class)
fields_txt = "# Insert common fields here.\nimport graphene\n"
inputs_txt = "# Insert graphene.InputObjectType classes.\nimport graphene\n"
mutations_txt = "# Insert graphql mutations here.\nimport graphene\n\nclass {}(graphene.AbstractType):\n pass\n".format(mutation_class)
queries_txt = "# Insert graphql queries here.\nimport graphene\n\nclass {}(graphene.AbstractType):\n pass\n".format(query_class)
types_txt = "# Insert DjangoObjectType classes here.\nimport graphene\nfrom graphene_django.types import DjangoObjectType\n"
for fname, file_text in [("__init__.py", init_txt),
("fields.py", fields_txt),
("inputs.py", inputs_txt),
("mutations.py", mutations_txt),
("queries.py", queries_txt),
("types.py", types_txt),
]:
with open(os.path.join(schema_directory, fname), "w") as output_file:
output_file.write(file_text)
print("Created {}".format(fname))
来自 Django 内部 shell,运行 喜欢 schema_setup("my_app")
注:
- 这假设您在
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
等设置中设置了 - 在您的顶级架构中,导入
from my_app.schema import MyAppQuery, MyAppMutation
- 我在 "query" 与 "queries" 和 "mutation" 与 "mutations" 之间来回切换——截至目前,石墨烯文档还没有一致
PROJECT_DIR