Django-rest-framework: Fornece uma maneira de evitar a importação circular de serializadores

Criado em 18 jun. 2020  ·  3Comentários  ·  Fonte: encode/django-rest-framework

É um caso comum onde você tem módulos em que ambos se referem um ao outro.

Por exemplo, módulos de usuários e postagens. Nos usuários você tem Usuário e nas postagens você tem Postagem e Anexo

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


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

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

No Django, há uma maneira de declarar Chaves Estrangeiras que evita dependências circulares, declarando o modelo referenciado por uma string:

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

O DRF poderia oferecer algo assim para serializadores? Algo como

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

Todos 3 comentários

Olá, mrodal!

Consegui fazer o mesmo implementando o seguinte em um dos serializadores "circulares": DRF: Relações reversas
Django: Seguindo relacionamentos “para trás”

Embora eu ache que seja bastante complexo.

Na verdade, tenho o mesmo caso em um projeto em que trabalho, mas você realmente não deveria. A melhor prática, de um curso de engenharia e arquitetura de software, é ter uma dependência unilateral. Se possível, pelo menos. Se houver um acoplamento muito próximo entre os dois aplicativos, eles talvez devam ser um aplicativo, alternativamente, eles devem ter um pai comum. Você também pode mover seu serializador para um subaplicativo, se aplicável.

Posso estar errado, mas AFAIK essa é a melhor prática.

Estou surpreso que isso não termine em um loop infinito.

Esta página foi útil?
0 / 5 - 0 avaliações