graphql- django обновить мутацию с необязательными полями идиома? - PullRequest
0 голосов
/ 30 января 2020

При реализации мутаций обновления GraphQL со многими (здесь просто a и b) необязательными полями InputObjectType генерируется множество шаблонов для проверки, были ли переданы поля InputObjectTypes. Есть ли какая-то идиома, которая считается лучшей практикой в ​​отношении этой топи c?

# <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()

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете сделать это:

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

Но, тем не менее, я также нахожу какой-то элегантный способ сделать это. 100

Но если пользователь хочет удалить содержимое из поля, то что вы будете делать, так как проверяете !None. ИМО, лучшая практика, когда мы обновляем данные, мы отправляем все данные с обновленными полями. Поэтому нам не нужно проверять, пусто это или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...