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?
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.
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.
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.
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.
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).
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! __".
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.
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).
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