【问题标题】:graphql-django update mutation with optional fields idiom?带有可选字段习语的graphql-django更新突变?
【发布时间】:2020-05-16 02:06:53
【问题描述】:

当使用许多(这里只是 ab)可选 InputObjectType 字段实现 GraphQL 更新突变时,它会生成大量样板来检查 InputObjectTypes 字段是否已通过。是否有一些习语被认为是最佳实践 w.r.t.这个话题?

# <app>/models.py

from django.db import models

class Something(models.Model):
    a = models.CharField(default='')
    b = models.CharField(default='')


# <app>/schema.py

import graphene
from graphene_django import DjangoObjectType
from .models import Something


class SomethingType(DjangoObjectType):
    class Meta:
        model = Something


class SomethingInput(graphene.InputObjectType):
    # all fields are optional
    a = graphene.String()
    b = graphene.String()


class SomethingUpdateMutation(graphene.Mutation):
    class Arguments:
        id = graphene.ID(required=True)
        something_data = SomethingInput(required=True)

    something = graphene.Field(SomethingType)

    def mutate(self, info, id, something_data):
        something_db = Something.objects.get(pk=id)
        # checking if fields have been passed or not and
        # only change corresponding db value if value has been passed
        if something_data.a is not None:
            something_db.a = something_data.a
        if something_data.b is not None:
            something_db.b = something_data.b
        something_db.save()
        return SomethingUpdateMutation(something=something)


class Mutation(object):
    # project schema inherits from this class
    something_update_mutation = SomethingUpdateMutation.Field()

【问题讨论】:

    标签: django graphene-python graphene-django


    【解决方案1】:

    你可以这样做:

    def mutate(self, info, **kwargs):
        user = info.context.user
        for k, v in kwargs.items():
            user.k = v
        user.save()
        return UpdateUser(user=user)
    

    但是,我还在寻找一些优雅的方法来做到这一点。 ?

    但是,如果用户想从字段中删除内容,那么你会做什么,因为你正在检查!None。 IMO,最佳实践,当我们更新数据时,我们会发送所有带有更新字段的数据。所以我们不需要检查,是不是空的。

    【讨论】:

    • 我认为在更新模型时发送所有数据不是最佳做法。原因是您必须将所有模型的数据存储在与您的 GraphQL API 交互的系统中,例如前端代码中的客户端。这意味着您必须在有人更改表单中的数据之前查询所有模型数据,或者您必须将模型数据存储在前端。后期更惨。必须将状态存储在后端以外的其他地方是不好的。
    • 这里需要使用setattr(user, k, v)user.k = vuser对象上创建一个新属性kdjango.db.models.Model实例是可变的)
    猜你喜欢
    • 2019-05-22
    • 2018-01-08
    • 1970-01-01
    • 2020-05-30
    • 2017-07-28
    • 2020-11-15
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多