🛰️ BaseViewSet - Vue générique pour Django REST Framework¶
Ce BaseViewSet fournit une base stable, réutilisable et extensible pour construire des APIs Django REST prêtes à la consommation par un frontend VueJS.
Il suit les règles de codage NASA, le principe DRY et une logique orientée scalabilité et sécurité.
🚀 Fonctionnalités clés¶
🔁 Filtrage dynamique par URL (
restaurant_pk,menu_pk, etc.)🔍 Recherche avancée via endpoint
/search/sur les champs définis📄 Schéma JSON automatique pour le frontend (
/schema)✅ Création avec clés étrangères automatiques
🔐 Robuste et sécurisé (validations strictes, erreurs explicites)
📦 Pagination conditionnelle (
?pagination=falsepour désactiver)
🔧 Utilisation¶
1. Héritez de BaseViewSet¶
class ProductViewSet(BaseViewSet):
model = Product
serializer_class = ProductSerializer
queryset = Product.objects.all()
filter_mapping = {
'restaurant_pk': 'restaurant_id',
'category_pk': 'category_id',
}
extra_search_fields = ['name', 'description']
2. Exemple de route¶
router.register(
r'restaurants/(?P<restaurant_pk>[^/.]+)/products',
ProductViewSet,
basename='restaurant-products'
)
📡 Endpoints disponibles¶
/schema/¶
Renvoie automatiquement une description des champs disponibles dans le serializer, utile pour le frontend.
/search/¶
Effectue une recherche textuelle basée sur les champs définis dans extra_search_fields.
Exemples :¶
GET /api/pei/search/?search=hydrant
GET /api/suivie_pei/search/?search=2024&pagination=false
📁 Extension¶
Vous pouvez surcharger :
get_additional_filters(): pour ajouter des filtres personnalisés,filter_mapping: pour mapper les paramètres d’URL aux champs,extra_search_fields: pour autoriser d’autres champs dans la recherche.
🧠 Bonnes pratiques¶
Déclarez toujours
modeletserializer_classdans vos ViewSets enfants.Utilisez des
filter_mappingcohérents avec votre schéma de données.Gardez vos modèles simples, vos serializers explicites.
📜 Licence¶
MIT — Réutilisable dans tous vos projets pro/perso.