【问题标题】:How to make Graphene Input Class variables optional?如何使石墨烯输入类变量可选?
【发布时间】:2018-02-02 22:39:24
【问题描述】:

在 GraphQL 更新突变中,我希望能够传入子对象的值,但我希望这些值中的每一个都是可选的。

所以我创建了一个这样的输入类:

class CityCouncilInput(graphene.InputObjectType):
  mayor = graphene.String()
  treasurer = graphene.String()

现在,我希望能够为市长和财务主管传递任一值,或者只传递其中一个值。

请知道,如果传入所有值,我的代码可以正常工作。我只希望这些字段值是可选的。我该怎么做?

罗伯特

【问题讨论】:

    标签: graphene-python


    【解决方案1】:

    你可以试试

    class CityCouncilInput(graphene.InputObjectType):
      mayor = graphene.String(required=False, default=None)
      treasurer = graphene.String(required=False, default=None)
    

    【讨论】:

    • default_value 获取最新版本的graphene
    【解决方案2】:

    我认为最简单的方法是为突变函数定义一个默认参数

    假设您有以下模型,其中您的值可以为空(注意:我假设 mayor 和 treasurer 都可以为空,但 NULL 不能为空 - 否则我猜你可以将None 作为默认参数传递):

    class CityCouncil(models.Model):
        mayor = models.TextField(max_length=1000, blank=True)
        treasurer = models.CharField(max_length=1000, blank=True)
    

    然后创建市议会,这应该可行:

    class createCityCouncil(graphene.Mutation):
        mayor = graphene.String()
        treasurer = graphene.String()
    
        class Arguments:
            mayor = graphene.String()
            treasurer = graphene.String()
    
        def mutate(self, mayor="", treasurer=""):
    
            council = CityCouncil(mayor=mayor, treasurer=treasurer)
            council.save()
    
            return createCityCouncil(
                mayor=council.mayor, 
                treasurer=council.treasurer
            )
    

    同样,在执行更新突变时,您可以传入可选参数并选择性地使用setattr 更新对象的属性。

    class updateCityCouncil(graphene.Mutation):
        mayor = graphene.String()
        treasurer = graphene.String()
    
        class Arguments:
            mayor = graphene.String()
            treasurer = graphene.String()
    
        def mutate(self, info, id, **kwargs):
            this_council=CityCouncil.objects.get(id=id)
            if not this_council:
                raise Exception('CityCouncil does not exist')
    
            for prop in kwargs:
                setattr(this_council, prop, kwargs[prop])
    
            this_council.save
    
            return updateCityCouncil(
                mayor=this_council.mayor, 
                treasurer=this_council.treasurer
            )
    

    【讨论】:

      【解决方案3】:

      您可能只需要在您的 mutate 函数中运行一个 if 语句来更新任一字段,并且类 updateCityCouncil 突变的代码如下(PS:注意名为 CityCouncil 和 GraphQL 的模型的假设模型的类型):

          class CityCouncilType(DjangoObjectType):
              class Meta:
                  model = CityCouncil
      
          class CityCouncilInput(graphene.InputObjectType):
              id = graphene.Int()
              mayor = graphene.String()
              treasurer = graphene.String()
      
          class updateCityCouncil(graphene.Mutation):
              class Arguments:
                  id = graphene.Int(required=True)
                  input = CityCouncilInput(required=True)
      
              ok = graphene.Boolean()
              council = graphene.Field(CityCouncilType)
      
              @staticmethod
              def mutate(root, info, id, input=None):
                  ok = False
                  this_council = CityCouncil.objects.get(pk=id)
                  if this_council:
                      ok = True
                      if input.mayor is not None:
                          this_council.mayor = input.mayor
                      if input.treasurer is not None:
                          this_council.treasurer = input.treasurer
                      this_council.save()
                      return updateCityCouncil(ok=ok, council=this_council)
                  return updateCityCouncil(ok=ok, council=None)
      

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2018-07-26
        • 2019-12-20
        • 2020-09-01
        • 2020-09-07
        • 2017-03-18
        • 2017-05-11
        • 2022-01-24
        • 2020-07-27
        相关资源
        最近更新 更多