Django-rest-framework: Fournir un moyen d'éviter l'importation circulaire de sérialiseurs

Créé le 18 juin 2020  ·  3Commentaires  ·  Source: encode/django-rest-framework

C'est un cas courant où vous avez des modules où les deux se réfèrent l'un à l'autre.

Par exemple, les modules utilisateurs et publications. Sur les utilisateurs que vous avez User et sur les publications, vous avez Post and Attachment

# users
class UserSerializer:
    posts = PostSerializer()
    profile_attachments = AttachmentSerializer()


#posts
class PostSerializer:
    user = StringSerializer()
    attachments = AttachmentSerializer()

class AttachmentSerializer:
    name = CharField()
    size = IntegerField()

Dans Django, il existe un moyen de déclarer des clés étrangères qui évite les dépendances circulaires, en déclarant le modèle référencé par une chaîne :

profile_attachment = models.ForeignKey('posts.Attachment', on_delete=models.CASCADE)

DRF pourrait-il offrir quelque chose comme ça pour les sérialiseurs ? Quelque chose comme

profile_attachment = ModelSerializer(serializer='posts.AttachmentSerializer')

Tous les 3 commentaires

Salut mrodal !

J'ai réussi à obtenir le même résultat en implémentant ce qui suit dans l'un des sérialiseurs "circulaires" : DRF : relations inverses
Django : Suivre les relations « à l'envers »

Même si je pense que c'est assez complexe.

J'ai donc en fait le même cas dans un projet sur lequel je travaille, mais vous ne devriez vraiment pas. La meilleure pratique, à partir d'un cours de génie logiciel et d'architecture, est d'avoir une dépendance à sens unique. Si possible au moins. S'il existe un couplage très étroit entre les deux applications, elles devraient peut-être être une seule application, sinon elles devraient avoir un parent commun. Vous pouvez également déplacer votre sérialiseur dans une sous-application, le cas échéant.

Je me trompe peut-être, mais autant que je sache, c'est la meilleure pratique.

Je suis surpris que cela ne se termine pas en boucle infinie.

Cette page vous a été utile?
0 / 5 - 0 notes