Django registriert mehrere Admin-Tabellen mit einem Modell

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_filterkö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 User2Managerbenutzerdefinierte Managerklasse mit dem Namen, die erbt von Manager:

    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_querysetdurch 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()Managerfilter(is_enable=True)is_enable

  • Als nächstes definieren Sie ein UserModell mit dem Namen, das erbt von Model:

    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 UserModell verfügt über die Felder name, phoneund is_enable, die jeweils den Namen, die Mobiltelefonnummer und den Aktivierungsstatus darstellen. nameund phoneFelder sind CharFieldTypen, und is_enableFelder sind BooleanFieldTypen mit dem Standardwert True.

  • Definieren Sie dann ein Proxy-Modell mit dem Namen, das vom Modell User2erbt :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 objectsdie Eigenschaft auf festlegen .User2Manager()User2

    Hinweis: proxy = TrueDies 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 ist proxy = 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 User2gibt es ein Proxy-Modell. Durch die Einstellungen proxy = Trueweisen wir Django an, keine User2separate Datenbanktabelle dafür zu erstellen, sondern Userdieselbe Tabelle mit dem Originalmodell zu teilen. Auf diese Weise können wir User2die 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 adminwerden im Admin-Hintergrund registriert . Erstellen Sie eine Verwaltungsklasse für das Modell :UserUser2
    UserUserAdmin

    from django.contrib import admin
    
    @admin.register(User)
    class UserAdmin(admin.ModelAdmin):
        search_fields = ['name', 'phone']
        list_display = ('id', 'name', 'phone')
    
  • In verknüpfen UserAdminwir 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.UserUserAdminsearch_fields['name', 'phone']list_display

  • User2Erstellen Sie eine Verwaltungsklasse für das Proxy-Modell User2Admin:

    @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, um User2das Proxy-Modell mit der Verwaltungsklasse zu User2Adminverknüpfen . In sind dieselben und Eigenschaften so User2Admineingestellt , dass sie im Admin-Hintergrund über ähnliche Such- und Listenanzeigefunktionen verfügen.UserAdminsearch_fieldslist_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-Modells User2Adminverwendet 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 .UserUser2UserAdminUserUser2AdminUser2

  • 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.

おすすめ

転載: blog.csdn.net/weixin_44649870/article/details/131132017