2017-07-21 138 views
0

我正在构建我的第一个GraphQL变种。最初我使用我找到的示例代码构建它。但是现在我正在重构它的结构。虽然代码似乎工作正常,因为我相对较新的Django,我不确定我使用的方法是Django/Python的最佳做法。将方法添加到Django模型中

这里是我的相关代码:

#models.py 
 

 
class Workflow(models.Model): 
 
    name = models.CharField(max_length=30) 
 
    description = models.TextField(blank=True, null=True) 
 

 
    def __str__(self): 
 
     return "{}".format(self.name) 
 

 
    @classmethod 
 
    def create(cls, name, description): 
 
     new_workflow = cls(
 
      name = name, 
 
      description = description 
 
     ) 
 
     
 
     new_workflow.save() 
 
     return new_workflow

# mutations.py 
 

 
class Workflow(DjangoObjectType): 
 
    class Meta: 
 
     model = WorkflowModel 
 
     interfaces = (relay.Node,) 
 

 
    @classmethod 
 
    def get_node(cls, id, context, info): 
 
     node = get_workflow(id) 
 
     return node 
 

 

 
class CreateWorkflow(relay.ClientIDMutation): 
 
    class Input: 
 
     name = graphene.String() 
 
     description = graphene.String() 
 

 
    workflow = graphene.Field(Workflow) 
 
    success = graphene.Boolean() 
 
    errors = graphene.String() 
 

 
    @classmethod 
 
    def mutate_and_get_payload(cls, input, context, info): 
 
     name = input.get('name') 
 
     description = input.get('description') 
 

 
     try: 
 
      workflow = WorkflowModel.create(name, description) 
 
      return CreateWorkflow(workflow=workflow, success=True) 
 

 
     except Exception as e: 
 
      success = False 
 
      return CreateWorkflow(workflow=None, success=False, errors=str(e)) 
 

 

 
class Mutation(graphene.AbstractType): 
 
    create_workflow = CreateWorkflow.Field()

我的主要问题与我公司推出def create到Django的工作流模型的方式去做。这是做到这一点的正确方法吗?

罗伯特

回答

0

你并不需要创建一个“创造”的方法为在Django模型类。您可以创建一个调用其init方法的新对象或使用Class.objects.create()。所以,你可以只是:

models.py

class Workflow(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return "{}".format(self.name) 

然后创建一个 “工作流程”,您可以使用:

new_obj = Workflow(name="wf name", description="wf description") 
new_obj.save() 

或者

Workflow.objects.create(name="wf name",description="wf description) 

通常你创建新类方法或覆盖现有的其他需求。例如:

class Workflow(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.TextField(blank=True, null=True) 
    deleted = models.DateTimeField(blank=True, null=True) 

    @property 
    def short_description(self): 
     if self.description: 
      return "%s..." % self.description[:20] 

    # ovewriting the superclass' delete method 
    def delete(self): 
     self.deleted = timezone.now() 
     self.save() 

    def __str__(self): 
     return "{}".format(self.name)