Salut à tous,
Je suis en train d'utiliser Django Rest Framework pour réaliser une API, et avant d'utiliser un serializer custom je voudrais savoir s'il n'existait pas un moyen plus simple d'arriver à mes fins…
Voici ce que je veux obtenir :
J'ai deux entités :
Exercise
, qui représente un exercice physique (par exemple, des pompes ou des tractions)Equipment
, qui représente un matériel qui peut être nécessaire pour un entraînement. Par exemple, pour les tractions, une barre de traction.
Voici le code de ces deux entités :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from django.db import models class Equipment(models.Model): code_name = models.CharField(max_length=255) def __str__(self): return self.code_name class Exercise(models.Model): name = models.CharField(max_length=255) has_speed = models.BooleanField(default=False) has_time = models.BooleanField(default=False) has_distance = models.BooleanField(default=False) has_reps = models.BooleanField(default=False) has_weight = models.BooleanField(default=False) has_percent_max_weight = models.BooleanField(default=False) video_url = models.URLField(max_length=255, blank=True) thumbnail_url = models.URLField(max_length=1023, blank=True) equipment_needed = models.ManyToManyField(Equipment) def __str__(self): return self.name |
Rien de compliqué donc, une simple ManyToMany
entre les deux entités.
Ce que je veux pouvoir faire avec mon serializer, c'est la chose suivante :
Quand je serialize un Exercise
, je veux que les entités imbriquées (Equipment
) soient représentées entièrement, comme montré ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "id": 5, "name": "test", "has_speed": false, "has_time": false, "has_distance": false, "has_reps": false, "has_weight": false, "has_percent_max_weight": false, "video_url": "", "thumbnail_url": "", "equipment_needed": [ { "id": 1, "code_name": "EQUIPMENT_WALL" } ] } |
Donc, avec toute l'entité imbriquée dans la réponse. C'est le comportement des Nested Relationships.
Par contre, lorsque je deserialize une entité (lors d'un PUT ou d'un POST), je ne veux utiliser dans l'entité imbriquée que son id, et pas les autres informations.
Un appel POST ressemblerait donc à ça :
1 2 3 4 | { "name": "test", "equipment_needed": [1, 3] } |
Avec 1
et 3
représentant les id de deux équipements.
Or quand je fais cela avec le Serializer, il m'indique fort logiquement que le champ code_name
est obligatoire et donc l'entité n'est pas créée…
Je voulais passer par l'écriture d'un Serializer personnalisé pour contourner le problème, mais avant de me lancer là-dedans et bien que ça ne soit pas très compliqué, je voulais venir vers vous pour voir s'il existait des solutions plus simples, étant donné que le comportement que je cherche à obtenir est assez classique il me semble.
Auriez-vous d'autres idées ?
Merci d'avance