9

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

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

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

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

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

罗伯特

4

3 回答 3

8

你可以试试

class CityCouncilInput(graphene.InputObjectType):
  mayor = graphene.String(required=False, default=None)
  treasurer = graphene.String(required=False, default=None)
于 2017-08-25T04:53:01.050 回答
1

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

假设您有以下模型,其中您的值可以为空(注意:我假设两者都可以为空mayortreasurer但不允许为空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
        )
于 2018-09-05T21:38:31.867 回答
0

您可能只需要在 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)
于 2020-05-10T08:54:38.563 回答