2017-07-20 48 views
0

我正在將一個Django REST API項目重建爲GraphQL。我現在有查詢&突變正常工作。Graphene-Django文件約定

我的大部分學習來自於現有的Graphene-Django & Graphene-Python代碼示例。他們之間似乎存在很多不一致之處。

在一些建議中,GraphQL查詢應放置在schema.py中,而突變應放置在mutation.py中。

我在想什麼更有意義的,而不是有這兩個文件保持各自的代碼: - queries.py - mutations.py

我是比較新的Django的&的Python雖然這樣想以確保我沒有違反任何約定。

對您的想法感興趣!

羅伯特

+0

如果您覺得下面的答案是正確的,請接受它。這在StackOverflow中是一個很好的練習:) –

回答

1

有沒有什麼約定呢,因爲GraphQL是一個休息的fairly new替代方法。因此,「約定」是在我們說話的時刻創建的。

但是,由於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。這兩個詞沒有太大的區別。

+0

感謝您的反饋,Nik,尤其是您的項目結構。 儘管作爲一名成功的英語作家,我不能同意你說「查詢」和「模式」之間幾乎沒有什麼區別。 :-) –

+0

哈!看看你的意思是什麼意思。我的意思是這個慣例傾向於將你的主模式文件命名爲「模式」。但將其命名爲「查詢」不會有太大變化。如果我們是合作開發者,那麼我絕對沒有問題:) –

+0

這太棒了。另一個可能的文件:fields.py - 用於在DjangoObjectType和graphene.InputObjectType類之間共享的字段。如果我要轉換當前臃腫的模式字段,我需要。 –

1

我很喜歡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的外殼內,運行像schema_setup("my_app")

注:

  • 這裏假設你在你的設置中設置PROJECT_DIRPROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
  • 在您的頂層架構,進口喜歡from my_app.schema import MyAppQuery, MyAppMutation
  • 我在「查詢」與「查詢」和「突變」之間來回回顧「突變」 - 截至此刻,石墨烯文件並不一致
+0

謝謝你,馬克。 快速問題:你知道是否有可能將突變和查詢分割成多個文件? –

+0

我在我的「主」模式文件,如「類查詢(MyApp1Query,MyApp2Query,graphene.ObjectType):...」,相同模式的「突變」類,然後使用像schema = graphene.Schema (query = Query,mutation = Mutations) –