5
votes

Supprimer la mutation dans Django GraphQL

Les docs de Graphene-Django pretty beaucoup explique comment créer et mettre à jour un objet. Mais comment le supprimer? Je peux imaginer que la requête ressemble à

mutation mut{
  deleteUser(id: 1){
    user{
      username
      email
    }
    error
  }
}

mais je doute que l'approche correcte soit d'écrire le code backend à partir de zéro.


3 commentaires

Cette question n'inclut pas Django, je l'ai déjà vu et cela montre comment le coder à partir de zéro, ce dont je doute que ce soit la bonne manière.


Mon mauvais je vais le supprimer


Je pense qu'il n'y a pas de mot-clé à supprimer, tous les exemples existants montrent des codes comme vous les avez écrits.


4 Réponses :


7
votes

Quelque chose comme ça, où UsersMutations fait partie de votre schéma:

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

    class Arguments:
        id = graphene.ID()

    @classmethod
    def mutate(cls, root, info, **kwargs):
        obj = User.objects.get(pk=kwargs["id"])
        obj.delete()
        return cls(ok=True)


class UserMutations(object):
    delete_user = DeleteUser.Field()


6 commentaires

À quoi sert le champ django_model ?


Bonne prise - il restait du code que j'ai utilisé pour créer l'exemple. Pas nécessaire donc j'ai retiré de l'exemple.


Merci, maintenant c'est tout à fait logique.


J'ai commencé à penser que GraphQL convient à Read et non à Create / Update / Delete . Téléchargez même des fichiers . Je dois personnaliser par moi-même. DRF est le bon IMO


J'accepte le téléchargement / téléchargement de fichiers. Voir ma réponse à ce sujet stackoverflow.com/questions/49503756/...


GraphQL est génial pour créer, mettre à jour et supprimer, surtout si vous utilisez une bibliothèque comme Apollo sur le FE. Les mises à jour automatiques du cache sont super sympas et aident vraiment à réduire la complexité de votre logique de gestion d'état FE. Je pense que la plupart de GraphQL est un mauvais sentiment dans django parce qu'il a besoin d'une intégration plus robuste de django et de DRF.



0
votes

En suivant le Python + Graphene hackernews tutorial , j'ai dérivé le implémentation suivante pour supprimer un objet Link:

class DeleteLink(graphene.Mutation):
    # Return Values
    id = graphene.Int()
    url = graphene.String()
    description = graphene.String()

    class Arguments:
        id = graphene.Int()

    def mutate(self, info, id):
        link = Link.objects.get(id=id)
        print("DEBUG: ${link.id}:${link.description}:${link.url}")
        link.delete()

        return DeleteLink(
            id=id,  # Strangely using link.id here does yield the correct id
            url=link.url,
            description=link.description,
        )


class Mutation(graphene.ObjectType):
    create_link = CreateLink.Field()
    delete_link = DeleteLink.Field()


0 commentaires

1
votes

J'ai créé cette bibliothèque pour les mutations de modèles simples: https://github.com/topletal/ django-model-mutations , vous pouvez voir comment supprimer des utilisateurs dans des exemples ici

class UserDeleteMutation(mutations.DeleteModelMutation):
    class Meta:
        model = User


0 commentaires

2
votes

Voici un petit modèle de mutation que vous pouvez ajouter à votre projet basé sur le relais ClientIDMutation et SerializerMutation de graphène-django. Je pense que ceci ou quelque chose comme ça devrait faire partie de graphene-django.

class DeleteSomethingMutation(RelayClientIdDeleteMutation):
     class Meta:
          model_class = SomethingModel

Utiliser

import graphene
from graphene import relay
from graphql_relay.node.node import from_global_id
from graphene_django.rest_framework.mutation import SerializerMutationOptions

class RelayClientIdDeleteMutation(relay.ClientIDMutation):
     id = graphene.ID()
     message = graphene.String()

     class Meta:
         abstract = True

     @classmethod
     def __init_subclass_with_meta__(
         cls,
         model_class=None,
         **options
     ):
         _meta = SerializerMutationOptions(cls)
         _meta.model_class = model_class
         super(RelayClientIdDeleteMutation, cls).__init_subclass_with_meta__(
             _meta=_meta,  **options
         )

     @classmethod
     def get_queryset(cls, queryset, info):
          return queryset

     @classmethod
     def mutate_and_get_payload(cls, root, info, client_mutation_id):
         id = int(from_global_id(client_mutation_id)[1])
         cls.get_queryset(cls._meta.model_class.objects.all(),
                     info).get(id=id).delete()
         return cls(id=client_mutation_id, message='deleted')

Vous pouvez également remplacer get_queryset.


0 commentaires