Django-rest-framework: Stellen Sie eine Möglichkeit bereit, um den zirkulären Import von Serializern zu vermeiden

Erstellt am 18. Juni 2020  ·  3Kommentare  ·  Quelle: encode/django-rest-framework

Dies ist ein häufiger Fall, wenn Sie Module haben, bei denen beide aufeinander verweisen.

Zum Beispiel Module Benutzer und Beiträge. Bei Benutzern haben Sie Benutzer und bei Beiträgen haben Sie Beitrag und Anhang

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


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

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

In Django ist es eine Möglichkeit , zu erklären , Fremdschlüssel , die zirkulären Abhängigkeiten vermeidet, das referenzierte Modell durch eine Zeichenfolge erklärt:

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

Könnte DRF so etwas für Serializer anbieten? Etwas wie

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

Alle 3 Kommentare

Hallo mrodal!

Ich habe dasselbe erreicht, indem ich Folgendes in einem der "zirkulären" Serializer implementiert habe: DRF: Reverse relations
Django: Beziehungen „rückwärts“ folgen

Obwohl ich denke, dass es ziemlich komplex ist.

Ich habe also tatsächlich den gleichen Fall in einem Projekt, an dem ich arbeite, aber das solltest du wirklich nicht. Best Practice aus einem Software-Engineering- und Architekturkurs besteht darin, eine Einweg-Abhängigkeit zu haben. Wenn möglich zumindest. Wenn es eine sehr enge Kopplung zwischen den beiden Apps gibt, sollten sie vielleicht eine App sein, alternativ sollten sie ein gemeinsames Elternteil haben. Sie können Ihren Serializer gegebenenfalls auch in eine Unter-App verschieben.

Ich könnte mich irren, aber AFAIK ist das beste Verfahren.

Ich bin überrascht, dass dies nicht in einer Endlosschleife endet.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen