- Utilisation d'APIView
ModelViewSet est un wrapper autour de APIView. ModelSerializer est un wrapper autour de Serializer.
1.1 Ajout de la route dans user/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('api/users/', views.UserInfoAPIView.as_view(), name='user-list-create'),
path('api/users/<pk>/', views.UserInfoAPIView.as_view(), name='user-detail-update-delete'),
]
</pk>
1.2 Création du fichier user/serializers.py pour le sérialiseur
Explication des paramètres de champ pour serializers.ModelSerializer et serializers.Serializer :
read_only=True: Indique que le champ ne peut pas être modifié par l'utilisateur et est uniquement destiné à la sortie de l'API. Aucune validation n'est effectuée pour ce champ lors de la sérialisation. Le champ est inclus dans la réponse sérialisée.write_only=True: Indique que le champ peut être utilisé lors de la création ou de la mise à jour d'une instance, mais n'est pas inclus dans la réponse sérialisée.required=True(par défaut) : Indique que le champ est obligatoire lors de la désérialisation (la donnée renvoyée par le frontend doit inclure ce champ). Si défini surFalse, le champ n'est pas obligatoire.allow_null=True: Permet au champ d'avoir une valeurNone. Si défini surFalse, le champ ne peut pas êtreNone.allow_blank=True: Permet au champ d'être une chaîne vide.label: Une étiquette pour le champ, utilisée pour son affichage.help_text: Un texte d'aide pour décrire le champ.style: Spécifie le type de champ pour le rendu.error_messages: Un dictionnaire pour personnaliser les mesasges d'erreur en cas de validation échouée.
Création du sérialiseur dans user/serializers.py :
from rest_framework import serializers
from .models import User # Assurez-vous que votre modèle User est importé
class UserProfileSerializer(serializers.Serializer):
user_id = serializers.IntegerField(read_only=True, source='pk') # Utilise le pk du modèle comme user_id
user_name = serializers.CharField(
max_length=50,
required=True,
error_messages={'required': 'Le nom d\'utilisateur est requis.'}
)
profile_picture = serializers.ImageField(required=False)
display_name = serializers.CharField(max_length=100, required=False)
location = serializers.CharField(max_length=255, required=False)
custom_field = serializers.SerializerMethodField(read_only=True) # Champ personnalisé pour l'affichage
class Meta:
model = User
fields = '__all__' # Ou spécifiez les champs comme ['user_id', 'user_name', ...]
def get_custom_field(self, obj):
''' obj: L'objet User passé '''
# Exemple : renvoyer le nom d'utilisateur concaténé avec un préfixe
return f"USR_{obj.username}"
def create(self, validated_data):
''' Appelée lorsque ser.save() est utilisé pour la création '''
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
''' Appelée lorsque ser.save() est utilisé pour la mise à jour '''
instance.username = validated_data.get('username', instance.username)
instance.save()
return instance
def validate_user_name(self, value):
''' Validation spécifique pour le champ user_name '''
if value.lower() == 'admin':
raise serializers.ValidationError('Impossible de créer un utilisateur avec le nom "admin".')
return value
def validate(self, attrs):
''' Validation multi-champs '''
if attrs.get("user_name") and attrs.get("user_name").lower() == 'root':
raise serializers.ValidationError('Impossible de créer un utilisateur avec le nom "root".')
return attrs
1.3 Ajout de la vue dans user/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User
from .serializers import UserProfileSerializer
class UserProfileAPIView(APIView):
def get(self, request, pk=None, format=None):
if pk:
try:
user_instance = User.objects.get(pk=pk)
serializer = UserProfileSerializer(user_instance)
except User.DoesNotExist:
return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)
else:
users_queryset = User.objects.all()
serializer = UserProfileSerializer(users_queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request, format=None):
serializer = UserProfileSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def put(self, request, pk, format=None):
try:
user_instance = User.objects.get(pk=pk)
except User.DoesNotExist:
return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)
serializer = UserProfileSerializer(user_instance, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
try:
user_instance = User.objects.get(pk=pk)
user_instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except User.DoesNotExist:
return Response({"detail": "Utilisateur non trouvé."}, status=status.HTTP_404_NOT_FOUND)
- Tests d'interface
2.1 Requête pour obtenir tous les utilisateurs
Méthode : GET
URL : /api/users/
2.2 Requête pour créer un utilisateur
Méthode : POST
URL : /api/users/
Corps de la requête (JSON) :
{
"user_name": "nouveau_utilisateur",
"display_name": "Nouveau Compte",
"location": "Quelque part"
}
2.3 Requête pour mettre à jour un utilisateur
Méthode : PUT
URL : /api/users/<user_id>/ (remplacez <user_id> par l'ID de l'utilisateur)
Corps de la requête (JSON) :
{
"display_name": "Compte Mis à Jour",
"location": "Ailleurs"
}
2.4 Requête pour supprimer un utilisateur
Méthode : DELETE
URL : /api/users/<user_id>/ (remplacez <user_id> par l'ID de l'utilisateur)