Лучший способ настроить страницу администратора django для существующего приложения

#python #django

#питон #джанго

Вопрос:

В настоящее время я изучаю некоторые основы django, пытаясь реализовать страницу администратора для следующего приложения: PowerGSLB

Хотя у него уже есть приятный пользовательский интерфейс, основанный на W2UI, моя цель — изучить django и выполнить аутентификацию на основе ролей с помощью модуля администратора django. Но на самом деле это не суть вопроса.

Я застрял с представлением пользователю базового списка записей DNS. Модель БД выглядит следующим образом:

db_model_image

Итак, я запустил inspectdb и создал модели, основанные на этой структуре. В конце концов, моя модель записей выглядит так:

 class Records(models.Model):
    id = models.BigAutoField(primary_key=True)
    name_type = models.ForeignKey(NamesTypes, models.DO_NOTHING)
    content_monitor = models.ForeignKey(ContentsMonitors, models.DO_NOTHING)
    view = models.ForeignKey('Views', models.DO_NOTHING)
    disabled = models.BigIntegerField()
    fallback = models.BigIntegerField()
    weight = models.BigIntegerField()

    def __str__(self):
        return f"{self.name_type} {self.content_monitor} {self.disabled} {self.fallback} {self.weight}"

    def get_all(self, in_var):
        self.result = dict()

        # Objects to get results from
        self.name_type_obj = NamesTypes.objects.get(id=self.name_type_id)
        self.content_monitor_obj = ContentsMonitors.objects.get(id=self.content_monitor_id)
        self.view_obj = Views.objects.get(id=self.view_id)
        self.names_obj = Names.objects.get(id=self.name_type_obj.name_id)
        self.domain_obj = Domains.objects.get(id=self.names_obj.domain_id)
        self.contents_obj = Contents.objects.get(id=self.content_monitor_obj.content_id)
        self.monitor_obj = Monitors.objects.get(id=self.content_monitor_obj.monitor_id)
        self.types_obj = Types.objects.get(value=self.name_type_obj.type_value_id)

        # Result vars
        self.result['domain'] = self.domain_obj.domain
        self.result['name'] = self.names_obj.name
        self.result['type'] = self.types_obj.type
        self.result['content'] = self.contents_obj.content
        self.result['ttl'] = self.name_type_obj.ttl
        self.result['id'] = self.id
        self.result['disabled'] = self.disabled
        self.result['fallback'] = self.fallback
        self.result['persistence'] = self.name_type_obj.persistence
        self.result['weight'] = self.weight
        self.result['monitor'] = self.monitor_obj.monitor
        self.result['view'] = self.view_obj.rule

        return self.result[in_var]
 

И мой admin.py для моего приложения выглядит так:

 from django.contrib import admin

from .models import Records


@admin.register(Records)
class RecordsAdmin(admin.ModelAdmin):
    list_display = (
        'get_domain',
        'get_name',
        'get_type',
        'get_content',
        'get_ttl',
        'get_disabled',
        'get_fallback',
        'get_persistence',
        'get_weight',
        'get_monitor',
        'get_view',
    )

    def get_domain(self, obj):
        return obj.get_all('domain')

    def get_name(self, obj):
        return obj.get_all('name')

    def get_type(self, obj):
        return obj.get_all('type')

    def get_content(self, obj):
        return obj.get_all('content')

    def get_ttl(self, obj):
        return obj.get_all('ttl')

    def get_disabled(self, obj):
        return obj.get_all('disabled')

    def get_fallback(self, obj):
        return obj.get_all('fallback')

    def get_persistence(self, obj):
        return obj.get_all('persistence')

    def get_weight(self, obj):
        return obj.get_all('weight')

    def get_monitor(self, obj):
        return obj.get_all('monitor')

    def get_view(self, obj):
        return obj.get_all('view')

    get_domain.short_description = "Domain"
    get_name.short_description = "Name"
    get_type.short_description = "Type"
    get_content.short_description = "Content"
    get_ttl.short_description = "TTL"
    get_disabled.short_description = "Disabled"
    get_fallback.short_description = "Fallback"
    get_persistence.short_description = "Persistence"
    get_weight.short_description = "Weight"
    get_monitor.short_description = "Monitor"
    get_view.short_description = "View"
 

Это действительно работает (вот изображение gslb_example), но это очень медленно, по сравнению с оригинальным интерфейсом. Очевидно, это потому, что у меня много запросов к базе данных вместо одного большого запроса, и вот вопрос — каков наилучший подход для этого в django admin?

Я использую django v.3.1.4

Ответ №1:

Возможно, вы можете изменить метод get_all(self, in_var)

и мог бы сделать так

 def get_all(self, in_var):
    self.result = dict()
    if in_var == "domain":
        return Domains.objects.get(id=self.names_obj.domain_id)
        
 

вы можете сопоставить in_var с классами моделей, если хотите
, и то же самое вы можете сделать с другими переменными