Quand utiliser Sérialiseur de créer() et ModelViewset de créer() perform_create()
Je tiens à préciser la documentation de django-rest-framework
concernant la création d'un objet de modèle. Jusqu'à présent, je trouve qu'il y a 3 approches sur la façon de gérer de tels événements.
-
Le Sérialiseur de
create()
méthode. Voici la la documentationclass CommentSerializer(serializers.Serializer): def create(self, validated_data): return Comment.objects.create(**validated_data)
-
La ModelViewset
create()
méthode. La Documentationclass AccountViewSet(viewsets.ModelViewSet): queryset = Account.objects.all() serializer_class = AccountSerializer permission_classes = [IsAccountAdminOrReadOnly]
-
La ModelViewset
perform_create()
méthode. La Documentationclass SnippetViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(owner=self.request.user)
Ces trois approches sont importantes en fonction de l'environnement de votre application.
Mais QUAND avons-nous besoin d'utiliser chaque create() /perform_create()
fonction??. D'autre part, j'ai trouvé quelques compte que deux de créer des méthodes ont été appelés pour une seule requête post le modelviewset de create()
et sérialiseur de create()
.
Espérons que quelqu'un voudrais partager une partie de leurs connaissances pour expliquer et ce sera sûrement très utile dans mon processus de développement.
Vous devez vous connecter pour publier un commentaire.
create(self, validated_data)
pour ajouter tous les détails de l'objet avant de l'enregistrer ET de la "prod" des valeurs dans chaque champ de modèle comme**validated_data
n'. Idéalement, vous voulez faire de cette forme de "pousser" dans UN seul endroit, de sorte que lecreate
méthode dans votreCommentSerializer
est le meilleur endroit. Sur le dessus de cela, vous pouvez également appeler les api externes pour créer des comptes d'utilisateurs, de leur côté, juste avant de les enregistrer vos comptes dans votre propre base de données. Vous devez utiliser cettecreate
de la fonction en collaboration avecModelViewSet
. Pense toujours - "Mince points de vue, d'Épaisseur sérialiseurs".Exemple:
La
create(self, request, *args, **kwargs)
fonction dans leModelViewSet
est définie dans leCreateModelMixin
classe qui est le parent deModelViewSet
.CreateModelMixin
principales fonctions sont les suivantes:Comme vous pouvez le voir, ci-dessus
create
fonction prend soin de l'appel de la validation de votre sérialiseur et la production de la réponse correcte. La beauté derrière tout cela, est que vous pouvez maintenant isoler la logique de l'application et de ne PAS vous préoccuper au sujet de la banale et répétitive de validation des appels et de la manipulation de réponse de la sortie :). Cela fonctionne très bien en conjonction avec lecreate(self, validated_data)
trouvé dans le sérialiseur (où votre application spécifique logique pourrait résider).perform_create(self, serializer)
fonction avec une seule ligne de code!?!? Ainsi, la principale raison derrière cela est de permettre customizeability lors de l'appel de lasave
fonction. Vous pourriez vouloir pour fournir des données supplémentaires avant d'appelersave
(commeserializer.save(owner=self.request.user)
et si nous n'avions pasperform_create(self, serializer)
, vous devez remplacer lacreate(self, request, *args, **kwargs)
et qui l'emporte sur tout le but d'avoir mixin de faire le lourd et fastidieux travail.Espérons que cette aide!
create(self, validated_data)
dans le sérialiseur, cela signifie qu'il se concentre sur les données de validation de la logique? et plus il peut les aider à retrouver le sérialiseur de données de retour à la réponse de la droite?return models.YourModel.objects.create(email=email, **validated_data)
permettra de sauver les données de la base de données de droit?objects.create
à la fois dans leserializer
etmodelviewset
. voici un exemple:class AccountSerializer(serializers.ModelSerializer): def create(self, validated_data): return Account.objects.create(**validated_data)
Etclass AccountViewSet(viewsets.ModelViewSet): def create(self, request): serializer = self.serializer_class(data=request.data) if serializer.is_valid(): Account.objects.create_user(**serializer.validated_data)
create
fonction dans le processus lui-même est seulement appelée lorsque vous neserializer.save()
. Dans votrecreate(self, request)
fonction à l'intérieur (AccountViewSet
), vous ne faites pas appelserializer.save()
à tous et, par conséquent, la seule création de l'instance qui se passe avec cet appel:Account.objects.create_user(**serializer.validated_data)
.create()
etperform_create()
a exécuter la commande?