#python #django
#питон #джанго
Вопрос:
В настоящее время я изучаю некоторые основы django, пытаясь реализовать страницу администратора для следующего приложения: PowerGSLB
Хотя у него уже есть приятный пользовательский интерфейс, основанный на W2UI, моя цель — изучить django и выполнить аутентификацию на основе ролей с помощью модуля администратора django. Но на самом деле это не суть вопроса.
Я застрял с представлением пользователю базового списка записей DNS. Модель БД выглядит следующим образом:
Итак, я запустил 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 с классами моделей, если хотите
, и то же самое вы можете сделать с другими переменными