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.
4 Réponses :
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()
À 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.
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()
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
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
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.
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.