【问题标题】:Adding Methods to a Django Model向 Django 模型添加方法
【发布时间】:2017-12-27 20:47:51
【问题描述】:

我正在构建我的第一个 GraphQL 突变。最初我使用我找到的示例代码构建它。但现在我正在重构它以使其结构更好。虽然代码似乎运行良好,但由于我对 Django 比较陌生,我不确定我使用的方法是否是 Django/Python 的最佳实践。

这是我的相关代码:

#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 工作流模型的方式有关。这是正确的做法吗?

罗伯特

【问题讨论】:

    标签: python django graphql


    【解决方案1】:

    您不需要在 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)
    

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2010-12-21
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2012-06-01
      • 2020-08-09
      相关资源
      最近更新 更多