[PYTHON] Über Djangos ProxyModel

Django hat ein ProxyModel. Wie ist das bequem zu bedienen und wann ist es nützlich?

Proxy-Modell https://docs.djangoproject.com/en/3.0/topics/db/models/#proxy-models

Dies ist nur die Erklärung.

Möglicherweise möchten Sie nur das Verhalten von Python in Ihrem Modell ändern. Wir können den Standardmanager ändern oder neue Methoden hinzufügen.

Es scheint jedoch, dass es verschiedene Juckreizpunkte gibt, und ich mache mir Sorgen darüber, wie ich es bequem verwenden kann. Es ist nur ein zielgerichtetes Mittel, also möchte ich es nicht erzwingen. Right way to return proxy model instance from a base model instance in Django?

Was ist vorerst mit dieser Situation?

Django ist eine Struktur, mit der Sie mehrere Anwendungen in Ihrem Projekt haben können. Ein gängiges Muster ist das Erstellen eines Administrationsbildschirms mit Django (einem Admin-Tool für Benutzer innerhalb von Django Admin) und einer API mit DRF. In solchen Fällen möchten Sie häufig die Datenbank für diese beiden Apps gemeinsam verwenden. Zum Beispiel wird ein umfangreicher Dienst in einen Mikrodienst konvertiert und möglicherweise nicht auf diese Weise aufgeteilt (verwaltet), aber ich denke, dass es in Startups eine ganze Reihe solcher Konfigurationen gibt, die in erster Linie Ergebnisse erzielen möchten.

スクリーンショット 2020-02-20 16.33.53.png

Wenn Sie eine solche Konfiguration vornehmen, ist es notwendig, ein gemeinsames Modell in Django und DRF zu verwenden, aber dies kann durch Suchen ziemlich leicht gefunden werden, und das System ist fertiggestellt und implementiert im Grunde nichts. Es gibt kein Problem.

Schreiben Sie viele Methoden in Modell?

Djangos ORM ist ausgezeichnet und ich habe selten die Möglichkeit, unformatiertes SQL zu schreiben, aber ich denke nicht, dass es in Ordnung ist, ORM-Anweisungen im Blick zu schreiben. Es ist so.

class MyViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = schema.MyObject.objects.all().order_by('id')
    serializer_class = MyObjectSerializer

Was ist der Unterschied zwischen diesem und dem altmodischen "Schreiben Sie kein SQL in Controller"? Weißt du, dass es nicht gut ist, wenn du es so machst?

class MyViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = schema.MyObject.objects.filter(type=schema.MyObject.TYPE.OPEN).order_by('id')
    serializer_class = MyObjectSerializer

Ich denke, es ist besser, eine Methode in ein Modell zu schreiben.

class MyViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = schema.MyObject.filter_of_open_object()
    serializer_class = MyObjectSerializer

class MyObject(models.Model):
    @classmethod
    def filter_of_open_object(cls):
        return cls..objects.filter(type=schema.MyObject.TYPE.OPEN).order_by('id')

So was.

Wie wäre es mit einem Modell, das Methoden verwendet, die nicht mit anderen Apps gemeinsam sind? ??

In diesem Beispiel ist die Abfrage vom Typ LIST, in der auch die für die Admin-App erforderlichen logisch gelöschten Daten aufgelistet sind, auf der API-Seite nicht erforderlich. Wenn Sie es versehentlich und nicht unnötig treffen (es ist ein Implementierungsfehler), erhalten Sie Daten, die Sie nicht anzeigen sollten.

__ In solchen Fällen kann ProxyModel verwendet werden. __ __

Es ist so. スクリーンショット 2020-02-20 16.45.12.png

Hinweise zur Modellmethode und zum ProxyModel

Beispiel für das Schreiben von ProxyModel

class Article(XModel):
    TYPE = Choices(
        ('DRAFT',   'Entwurf'),
        ('PUBLISH', 'Jetzt offen'),
    )

    type = StatusField(
        choices_name='TYPE',
        blank=False,
        default=TYPE.DRAFT,
        help_text="Artikelstatus",
    )

    text = models.TextField(
        null=False,
        blank=False,
        default="",
        help_text="Artikelinhalt",
    )

    writer = models.ForeignKey(
        to="Account",
        related_name="articles",
        null=False,
        on_delete=models.DO_NOTHING,
        help_text="Artikelschreiber",
    )

class ArticleProxy(ProxyModel, schema.Article):

    @classmethod
    def list_of_draft(cls):
        return cls.objects.filter(type=cls.TYPE.DRAFT)

Bitte schreiben Sie in dieser Form. Der Punkt ist cls.objects.filter. Selbst wenn die Bedeutung dieselbe ist, wenn es sich um "schema.Article.objects.filter" handelt, ist der Rückgabewert ein Array von "Article" (genau genommen handelt es sich um ein QuerySet, nicht um ein Array).

Hinweise zu Schreibmethoden in Model (Proxy)

class ArticleProxy(ProxyModel, schema.Article):

    @classmethod
    def list_of_future(cls):
        return cls.objects.filter(resavation_at=now())


class MyViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = ArticleProxy.list_of_future()
    serializer_class = ArticleSerializer

Wissen Sie, dass dies ein Fehler ist? now () wird nur einmal ausgewertet und nicht jedes Mal berechnet, wenn eine Anforderung vorliegt. Das Wesentliche dieses Problems ist, dass Methoden (oder Funktionen auf die alte Art) im Wesentlichen Black Boxes sind und aufgerufen werden sollten, ohne ihren Inhalt zu kennen. In diesem Beispiel sagt der Implementierer von View normalerweise "__ Es gibt eine bequeme Methode, verwenden wir sie! __".

Warum bleibst du dabei?

Es gibt eine Idee (in mir), dass selbst Kommunikation in einem Startup, das ein Unternehmen mit explosiver Geschwindigkeit gründet, nutzlos ist. Ich bin der Meinung, dass es eine Ära ist, in der 1on1 empfohlen wird und das Management beim Wechsel von Spinat zu Zassou im Vordergrund steht. Bei XTech sind die Organisationen, die Management benötigen, jedoch alt und nicht professionell. Das ist also der Fall. Ich denke ich brauche. (Der längste Teil meiner Karriere ist das Management, aber w)

Kurz gesagt, ich denke, dass ein Framework, das auch bei der Implementierung ohne Kommunikation verstanden werden kann, und dass, wenn Sie es normal erstellen, keine seltsamen Fehler oder Sicherheitslücken entstehen, wichtig ist, um die Produktivität zu steigern.

Empfehlung des Proxy-Modells

Die Person, die jede Anwendung implementiert, fügt eine Methode in ProxyModel hinzu und verwendet sie. Sie können nicht auf Daten zugreifen, auf die nur der Administrator zugreifen kann, wenn Sie sie normal verwenden (es sei denn, Sie schreiben eine solche Methode).

Schließlich

Es gibt auch eine Problemumgehung für den Fall, dass Sie eine Methode in das im obigen Beispiel angegebene Modell schreiben und diese wie eine Blackbox verwendet wird, um einen Fehler zu beheben. Ich frage mich, ob Sie sich das vorstellen oder in den nächsten Inhalt aufnehmen können.

Da es sich um eine Skizze handelt, denke ich, dass es typografische Fehler und seltsame Teile gibt. Wenn Sie also einen Kommentar abgeben können, werde ich mir Zeit nehmen, ihn zu überprüfen!

Recommended Posts

Über Djangos ProxyModel
Über Djangos Dekonstruktion und Dekonstruierbarkeit
Über LangID
Über CAGR
Über Python-Apt
Über die Erlaubnis
Informationen zu den Anforderungen.txt
Über das Gebietsschema
Über Achse = 0, Achse = 1
Über den Import
Über Numpy
Über pip
Über Linux
Über Endian
Über Linux
Über den Import
Djangos ImageField
Über Linux
Über Linux
Über cv2.imread
Über _ und __
Über wxPython
Informationen zum Model.save () -Verhalten von Django und zum MySQL-Deadlock-Fehler
Apropos Übertragung von Array-Parametern an QueryDict von django