Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

789 questions

1,218 réponses

3,016 commentaires

1,107 utilisateurs

DRF , serializer exotique

0 votes

Bonjour a tous,

Je decouvre ce fabuleux framework qu'est fjango Rest Framwork.
Mais la spec que j'ai est capilotracté. je m'explique

L'objet A a des fields ( normal jusque là) de tout type, je parlerai en particulier d'un field ForeignKey que nous nommerons A.FK et d'un field de type Many2Many que nous nomerons A.M2M.

La demande que j'ai recu est la suivante:
dans les representations je doit presenter ces fields ainsi:
A.FK := A.FK.name
A.M2M := [*A.M2M.all().agregate('name()]

dans les requetes entrantes, il en est de meme.
C'est a dire que vu de l'exterieur name se comporte comme la PK des obj

Si vous avez une piste, je prend car la j'ai testé pas mal d'intuition sans resultat probant.

demandé il y a 6 jours par lollo (164 points)

Il faudrait voir les pistes que vous avez teste pour voir si vous étiez ou non près du but
Pouvez vous mettre les bouts de codes concernes ?

1 Réponse

0 votes

A vue de nez, je dirais qu'il faut utiliser des MethodSerializer et faire le travail directement dans des fonctions associées au serializer.

Du coup ça serait :

class ASerializer(ModelSerializer):
    FK = MethodSerializer()
    M2M = MethodSerializer()

    def get_FK(self, obj):
        return obj.FK.name if obj.FK_id else None

    def get_M2M(self, obj):
        return [*obj.M2M.all().agregate('name')]

    class Meta:
        model = A
        fields = '__all__'
        # pas sûr pour le 'excludes' car c'est une surcharge de champs existants
        # excludes = ('FK', 'M2M')
répondu il y a 4 jours par debnet (1,022 points)

merci pour cette info,
je teste ca rapidement

donc si j'ai bien compris cela me permet de changer la representation.
Mais dans un PATCH ou un POST je ne peux pas envoyer le A_M2M.
A moins que j'ai rien compris

Ah oui, je n'avais pas vu que tu devais faire la même chose dans les deux sens. Les MethodSerializer sont read-only par nature, tu vas devoir passer par un serializer spécialisé pour les deux champs.

Le premier sera un FKNameSerializer qui mappera ton modèle derrière la FK et acceptera un "name" unique en entrée. Et pour l'autre ça sera un ListSerializer d'un M2MNameSerializer sur le même principe, c'est vraiment plus chiant à faire mais pas impossible.

Je tiens également à signaler que ce comportement casse la logique REST, surtout si "name" n'est pas unique.

...