【问题标题】:How to avoid using too much parameter in mutate() function?如何避免在 mutate() 函数中使用过多的参数?
【发布时间】:2019-07-23 07:22:53
【问题描述】:

Mutate 函数在执行更新操作时需要很多参数。根据官方石墨烯文档,我可以使用 (parent, root, obj) 对象来访问我的类对象。

我尝试通过 parent、root 和 obj 访问可变数据,但没有成功。

class UpdateEvent(graphene.Mutation):
    ok = graphene.Boolean()

    class Arguments:
        id = graphene.ID()
        name = graphene.String()

        event_start_date = graphene.types.datetime.Date()
        event_finish_date = graphene.types.datetime.Date()

        event_mark_as_finished = graphene.Boolean()

        event_description = graphene.String()

        event_location = graphene.String()

        event_price = graphene.Float()
        event_price_unit = graphene.String()


    def mutate(root, info):

       event = Events.objects.get(pk=root.id)
       event.name = root.name  
       event.event_start_date = root.event_start_date 
       event.event_finish_date= root.event_finish_date
       event.event_mark_as_finished = root.event_mark_as_finished
       event.event_description = root.event_description
       event.event_location = root.event_location
       event.event_price = root.event_price
       event.event_price_unit = root.event_price_unit
       event.save()


       # This class registered to the Mutation class*** 

"errors": [{ "message": "mutate() got an unexpected keyword argument 'event_description'"}]

将所有变量放入 mutate 函数中效果很好,但这是一种丑陋的方式。 我该如何处理?

【问题讨论】:

    标签: graphene-django


    【解决方案1】:

    用单一的输入类型包装它们:

    class UpdateEventMutationInput(graphene.InputObjectType):
        id = graphene.ID()
        name = graphene.String()
    
        event_start_date = graphene.types.datetime.Date()
        event_finish_date = graphene.types.datetime.Date()
        event_mark_as_finished = graphene.Boolean()
        event_description = graphene.String()
        event_location = graphene.String()
        event_price = graphene.Float()
        event_price_unit = graphene.String()
    

    并在突变中使用它:

    class UpdateEvent(graphene.Mutation):
        ok = graphene.Boolean()
    
        class Arguments:
            data = UpdateEventMutationInput(required=True)
    
        def mutate(root, info, data):
           event = Events.objects.get(pk=data.id)
           event.name = data.name  
           event.event_start_date = data.event_start_date 
           event.event_finish_date= data.event_finish_date
           event.event_mark_as_finished = data.event_mark_as_finished
           event.event_description = data.event_description
           event.event_location = data.event_location
           event.event_price = data.event_price
           event.event_price_unit = data.event_price_unit
           event.save()
    

    它也带来了这样的好处:

    1. 变异代码更少
    2. 很容易为这个突变编写一个请求(它将包含一个$data: UpdateEventMutationInput! 变量)
    3. 更少的跨版本冲突,因为您不必在突变输入更改时更新请求

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 2023-03-15
      • 2020-01-26
      相关资源
      最近更新 更多