Serializer custom

a marqué ce sujet comme résolu.

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 :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte