Django-rest-framework: Proporcionar una forma de evitar la importación circular de serializadores

Creado en 18 jun. 2020  ·  3Comentarios  ·  Fuente: encode/django-rest-framework

Es un caso común en el que tienes módulos en los que ambos se refieren entre sí.

Por ejemplo, usuarios de módulos y publicaciones. En los usuarios que tiene Usuario y en las publicaciones tiene Publicación y archivo adjunto

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


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

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

En Django hay una forma de declarar claves externas que evita las dependencias circulares, declarando el modelo al que se hace referencia mediante una cadena:

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

¿DRF podría ofrecer algo así para los serializadores? Algo como

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

Todos 3 comentarios

¡Hola mrodal!

Logré lograr lo mismo implementando lo siguiente en uno de los serializadores "circulares": DRF: Relaciones inversas
Django: Seguir relaciones "al revés"

Aunque creo que es bastante complejo.

Así que tengo el mismo caso en un proyecto en el que trabajo, pero tú no deberías. La mejor práctica, de un curso de ingeniería y arquitectura de software, es tener una dependencia unidireccional. Si es posible al menos. Si hay un acoplamiento muy estrecho entre las dos aplicaciones, tal vez deberían ser una aplicación, alternativamente, deberían tener un padre común. También puede mover su serializador a una aplicación secundaria si corresponde.

Podría estar equivocado, pero AFAIK, esa es la mejor práctica.

Me sorprende que esto no termine en un bucle infinito.

¿Fue útil esta página
0 / 5 - 0 calificaciones