einführen
- Lassen Sie uns zunächst die in diesem Artikel implementierten Funktionen vorstellen: In tatsächlichen Nutzungsszenarien befinden sich möglicherweise zu viele Daten in einer bestimmten Datentabelle, aber der Administratorhintergrund von Django ist im Hinblick auf die Abfragegeschwindigkeit für große Datenmengen schwer zu beschreiben. Zum Beispiel: Ich habe eine Benutzertabelle, aber das meiste davon dauert nur eine Weile, um deaktivierte Benutzer abzufragen, aber es ist zu langsam, alle Benutzer direkt abzufragen, also habe ich die Benutzertabelle im Admin-Hintergrund als zwei Tabellen angezeigt, eine mit allen Benutzern und eine mit allen Benutzern der andere zeigt nur deaktivierte Benutzer. Tatsächlich
list_filter
können Sie Benutzer auch direkt nach ihrem Status in einer Tabelle gruppieren, aber wenn die Datenmenge und die Gruppierungsbedingungen zunehmen, wird die Abfragegeschwindigkeit immer langsamer.
Modell definieren
-
Definieren Sie eine
User2Manager
benutzerdefinierte Managerklasse mit dem Namen, die erbt vonManager
:from django.db.models import Manager, Model class User2Manager(Manager): def get_queryset(self): return super().get_queryset().filter(is_enable=True)
-
In diesem benutzerdefinierten Manager wird die Methode überschrieben, um den Abfragesatz der Basisklasse ( )
get_queryset
durch Aufrufen abzurufen , und darauf basierend werden zusätzliche Filterbedingungen angewendet, d. h. Das bedeutet, dass wenn Sie diesen Manager später zum Abfragen der Datensätze des Modells verwenden, nur Datensätze mit einem Feld von „True“ zurückgegeben werden.super().get_queryset()
Manager
filter(is_enable=True)
is_enable
-
Als nächstes definieren Sie ein
User
Modell mit dem Namen, das erbt vonModel
:class User(Model): name = CharField(max_length=32, verbose_name='姓名') phone = CharField(max_length=11, verbose_name='手机号') is_enable = BooleanField(verbose_name='启用状态', default=True)
-
Dieses
User
Modell verfügt über die Feldername
,phone
undis_enable
, die jeweils den Namen, die Mobiltelefonnummer und den Aktivierungsstatus darstellen.name
undphone
Felder sindCharField
Typen, undis_enable
Felder sindBooleanField
Typen mit dem StandardwertTrue
. -
Definieren Sie dann ein Proxy-Modell mit dem Namen, das vom Modell
User2
erbt :User
class User2(User): objects = User2Manager() class Meta: proxy = True
-
Wenden Sie in diesem Proxy-Modell den benutzerdefinierten Manager auf das Modell an, indem Sie
objects
die Eigenschaft auf festlegen .User2Manager()
User2
Hinweis:
proxy = True
Dies ist eine Metaoption, die beim Definieren des Proxy-Modells verwendet wird. Diese Option teilt Django mit, dass das Modell ein Proxy-Modell ist.
Bei Verwendung eines Proxy-Modells werden keine neuen Tabellen in der Datenbank erstellt, sondern dieselben Tabellen werden mit dem Originalmodell geteilt. Das Proxy-Modell ermöglicht die Erweiterung, Anpassung und Änderung des Originalmodells, ohne dass neue Datenbanktabellen erstellt werden müssen.
Wenn wir in Django ein Modell nicht als Proxy-Modell definieren, wird es standardmäßig als normales Modell betrachtet und eine separate Tabelle in der Datenbank erstellt. Wenn jedoch festgelegt istproxy = True
, identifiziert Django das Modell als Proxy-Modell und erstellt keine neue Tabelle in der Datenbank.
Das Proxy-Modell erbt die Felder und Methoden des Originalmodells und wird nur verwendet, um eine andere Darstellung oder ein angepasstes Verhalten des Originalmodells bereitzustellen. Durch die Verwendung von Proxy-Modellen können Sie problemlos mehrere verschiedene Verwaltungsklassen für dasselbe Modell erstellen, um unterschiedliche Anforderungen und Präsentationsstile zu erfüllen. -
Im obigen Code
User2
gibt es ein Proxy-Modell. Durch die Einstellungenproxy = True
weisen wir Django an, keineUser2
separate Datenbanktabelle dafür zu erstellen, sondernUser
dieselbe Tabelle mit dem Originalmodell zu teilen. Auf diese Weise können wirUser2
die Verwaltungsklasse im Admin-Hintergrund registrieren und ihr eine angepasste Anzeige und ein angepasstes Verhalten bereitstellen, ohne dass zusätzliche Datenbanktabellen erforderlich sind.
Registrieren Sie sich als Administrator
-
Das Modul wird importiert und die Verwaltungsklassen des Modells und des Proxy-Modells
admin
werden im Admin-Hintergrund registriert . Erstellen Sie eine Verwaltungsklasse für das Modell :User
User2
User
UserAdmin
from django.contrib import admin @admin.register(User) class UserAdmin(admin.ModelAdmin): search_fields = ['name', 'phone'] list_display = ('id', 'name', 'phone')
-
In verknüpfen
UserAdmin
wir das Modell mit@admin.register(User)
dem Dekorateur . Stellen Sie dann die Eigenschaften auf ein , damit diese beiden Felder im Suchfeld des Admin-Hintergrunds durchsucht werden können. Die Eigenschaften geben an, welche Felder auf der Admin-Hintergrundlistenseite angezeigt werden.User
UserAdmin
search_fields
['name', 'phone']
list_display
-
User2
Erstellen Sie eine Verwaltungsklasse für das Proxy-ModellUser2Admin
:@admin.register(User2) class User2Admin(admin.ModelAdmin): search_fields = ['name', 'phone'] list_display = ('id', 'name', 'phone')
-
Auch hier verwenden wir
@admin.register(User2)
einen Decorator, umUser2
das Proxy-Modell mit der Verwaltungsklasse zuUser2Admin
verknüpfen . In sind dieselben und Eigenschaften soUser2Admin
eingestellt , dass sie im Admin-Hintergrund über ähnliche Such- und Listenanzeigefunktionen verfügen.UserAdmin
search_fields
list_display
-
Durch den obigen Code und die obige Konfiguration haben wir zwei Admin-Hintergrundverwaltungsklassen implementiert
UserAdmin
, die zum Verwalten der Datensätze des Modells bzw. des Proxy-ModellsUser2Admin
verwendet werden . Auf diese Weise können wir im Admin-Hintergrund mehrere Listeninformationen anzeigen, die Modelldatensätze und Datensätze zusätzlich gefilterter Proxy-Modelle anzeigen .User
User2
UserAdmin
User
User2Admin
User2
-
Diese Art der Verwendung des Agentenmodells kann uns dabei helfen, verschiedene Ansichten flexibel anzuzeigen und zu verwalten und die Ergebnisse des Modells entsprechend unterschiedlichen Anforderungen und Rollen zu filtern, was zu einer besseren Verwaltungserfahrung führt.