Переделал модель Parameter и связь с ObjItem
This commit is contained in:
@@ -218,11 +218,11 @@ def export_objects_to_csv(modeladmin, request, queryset):
|
||||
queryset = queryset.select_related(
|
||||
'geo_obj',
|
||||
'created_by__user',
|
||||
'updated_by__user'
|
||||
).prefetch_related(
|
||||
'parameters_obj__id_satellite',
|
||||
'parameters_obj__polarization',
|
||||
'parameters_obj__modulation'
|
||||
'updated_by__user',
|
||||
'parameter_obj',
|
||||
'parameter_obj__id_satellite',
|
||||
'parameter_obj__polarization',
|
||||
'parameter_obj__modulation'
|
||||
)
|
||||
|
||||
response = HttpResponse(content_type='text/csv; charset=utf-8')
|
||||
@@ -248,7 +248,7 @@ def export_objects_to_csv(modeladmin, request, queryset):
|
||||
])
|
||||
|
||||
for obj in queryset:
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
param = getattr(obj, 'parameter_obj', None)
|
||||
geo = obj.geo_obj
|
||||
|
||||
# Форматирование координат
|
||||
@@ -284,12 +284,25 @@ def export_objects_to_csv(modeladmin, request, queryset):
|
||||
# Inline Admin Classes
|
||||
# ============================================================================
|
||||
|
||||
class ParameterObjItemInline(admin.StackedInline):
|
||||
model = ObjItem.parameters_obj.through
|
||||
extra = 0
|
||||
class ParameterInline(admin.StackedInline):
|
||||
"""Inline для редактирования параметра объекта."""
|
||||
model = Parameter
|
||||
extra = 0
|
||||
max_num = 1
|
||||
can_delete = True
|
||||
verbose_name = "ВЧ загрузка"
|
||||
verbose_name_plural = "ВЧ загрузки"
|
||||
verbose_name_plural = "ВЧ загрузка"
|
||||
fields = (
|
||||
'id_satellite',
|
||||
'frequency',
|
||||
'freq_range',
|
||||
'polarization',
|
||||
'modulation',
|
||||
'bod_velocity',
|
||||
'snr',
|
||||
'standard'
|
||||
)
|
||||
autocomplete_fields = ('id_satellite', 'polarization', 'modulation', 'standard')
|
||||
|
||||
|
||||
# ============================================================================
|
||||
@@ -370,13 +383,15 @@ class ParameterAdmin(ImportExportActionModelAdmin, BaseAdmin):
|
||||
"bod_velocity",
|
||||
"snr",
|
||||
"standard",
|
||||
"related_objitem",
|
||||
"sigma_parameter"
|
||||
)
|
||||
list_display_links = ("frequency", "id_satellite")
|
||||
list_select_related = ("polarization", "modulation", "standard", "id_satellite")
|
||||
list_select_related = ("polarization", "modulation", "standard", "id_satellite", "objitem")
|
||||
|
||||
list_filter = (
|
||||
HasSigmaParameterFilter,
|
||||
("objitem", MultiSelectRelatedDropdownFilter),
|
||||
("id_satellite", MultiSelectRelatedDropdownFilter),
|
||||
("polarization__name", MultiSelectDropdownFilter),
|
||||
("modulation", MultiSelectRelatedDropdownFilter),
|
||||
@@ -395,12 +410,21 @@ class ParameterAdmin(ImportExportActionModelAdmin, BaseAdmin):
|
||||
"modulation__name",
|
||||
"polarization__name",
|
||||
"standard__name",
|
||||
"objitem__name",
|
||||
)
|
||||
|
||||
ordering = ("-frequency",)
|
||||
autocomplete_fields = ("objitems",)
|
||||
autocomplete_fields = ("objitem",)
|
||||
inlines = [SigmaParameterInline]
|
||||
|
||||
def related_objitem(self, obj):
|
||||
"""Отображает связанный ObjItem."""
|
||||
if hasattr(obj, 'objitem') and obj.objitem:
|
||||
return obj.objitem.name
|
||||
return "-"
|
||||
related_objitem.short_description = "Объект"
|
||||
related_objitem.admin_order_field = "objitem__name"
|
||||
|
||||
def sigma_parameter(self, obj):
|
||||
"""Отображает связанный параметр Sigma."""
|
||||
sigma_obj = obj.sigma_parameter.all()
|
||||
@@ -636,16 +660,25 @@ class ObjItemAdmin(BaseAdmin):
|
||||
"updated_at",
|
||||
)
|
||||
list_display_links = ("name",)
|
||||
list_select_related = ("geo_obj", "created_by__user", "updated_by__user")
|
||||
list_select_related = (
|
||||
"geo_obj",
|
||||
"created_by__user",
|
||||
"updated_by__user",
|
||||
"parameter_obj",
|
||||
"parameter_obj__id_satellite",
|
||||
"parameter_obj__polarization",
|
||||
"parameter_obj__modulation",
|
||||
"parameter_obj__standard"
|
||||
)
|
||||
|
||||
list_filter = (
|
||||
UniqueToggleFilter,
|
||||
("parameters_obj__id_satellite", MultiSelectRelatedDropdownFilter),
|
||||
("parameters_obj__frequency", NumericRangeFilterBuilder()),
|
||||
("parameters_obj__freq_range", NumericRangeFilterBuilder()),
|
||||
("parameters_obj__snr", NumericRangeFilterBuilder()),
|
||||
("parameters_obj__modulation", MultiSelectRelatedDropdownFilter),
|
||||
("parameters_obj__polarization", MultiSelectRelatedDropdownFilter),
|
||||
("parameter_obj__id_satellite", MultiSelectRelatedDropdownFilter),
|
||||
("parameter_obj__frequency", NumericRangeFilterBuilder()),
|
||||
("parameter_obj__freq_range", NumericRangeFilterBuilder()),
|
||||
("parameter_obj__snr", NumericRangeFilterBuilder()),
|
||||
("parameter_obj__modulation", MultiSelectRelatedDropdownFilter),
|
||||
("parameter_obj__polarization", MultiSelectRelatedDropdownFilter),
|
||||
GeoKupDistanceFilter,
|
||||
GeoValidDistanceFilter,
|
||||
("created_at", DateRangeQuickSelectListFilterBuilder()),
|
||||
@@ -655,12 +688,12 @@ class ObjItemAdmin(BaseAdmin):
|
||||
search_fields = (
|
||||
"name",
|
||||
"geo_obj__location",
|
||||
"parameters_obj__frequency",
|
||||
"parameters_obj__id_satellite__name",
|
||||
"parameter_obj__frequency",
|
||||
"parameter_obj__id_satellite__name",
|
||||
)
|
||||
|
||||
ordering = ("-updated_at",)
|
||||
inlines = [ParameterObjItemInline, GeoInline]
|
||||
inlines = [GeoInline, ParameterInline]
|
||||
actions = [show_selected_on_map, export_objects_to_csv]
|
||||
readonly_fields = ("created_at", "created_by", "updated_at", "updated_by")
|
||||
|
||||
@@ -676,7 +709,7 @@ class ObjItemAdmin(BaseAdmin):
|
||||
|
||||
def get_queryset(self, request):
|
||||
"""
|
||||
Оптимизированный queryset с использованием select_related и prefetch_related.
|
||||
Оптимизированный queryset с использованием select_related.
|
||||
|
||||
Загружает связанные объекты одним запросом для улучшения производительности.
|
||||
"""
|
||||
@@ -684,31 +717,30 @@ class ObjItemAdmin(BaseAdmin):
|
||||
return qs.select_related(
|
||||
"geo_obj",
|
||||
"created_by__user",
|
||||
"updated_by__user"
|
||||
).prefetch_related(
|
||||
"parameters_obj__id_satellite",
|
||||
"parameters_obj__polarization",
|
||||
"parameters_obj__modulation",
|
||||
"parameters_obj__standard"
|
||||
"updated_by__user",
|
||||
"parameter_obj",
|
||||
"parameter_obj__id_satellite",
|
||||
"parameter_obj__polarization",
|
||||
"parameter_obj__modulation",
|
||||
"parameter_obj__standard"
|
||||
)
|
||||
|
||||
def sat_name(self, obj):
|
||||
"""Отображает название спутника из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param and param.id_satellite:
|
||||
return param.id_satellite.name
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
if obj.parameter_obj.id_satellite:
|
||||
return obj.parameter_obj.id_satellite.name
|
||||
return "-"
|
||||
sat_name.short_description = "Спутник"
|
||||
sat_name.admin_order_field = "parameters_obj__id_satellite__name"
|
||||
sat_name.admin_order_field = "parameter_obj__id_satellite__name"
|
||||
|
||||
def freq(self, obj):
|
||||
"""Отображает частоту из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param:
|
||||
return param.frequency
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
return obj.parameter_obj.frequency
|
||||
return "-"
|
||||
freq.short_description = "Частота, МГц"
|
||||
freq.admin_order_field = "parameters_obj__frequency"
|
||||
freq.admin_order_field = "parameter_obj__frequency"
|
||||
|
||||
def distance_geo_kup(self, obj):
|
||||
"""Отображает расстояние между геолокацией и Кубсатом."""
|
||||
@@ -736,42 +768,39 @@ class ObjItemAdmin(BaseAdmin):
|
||||
|
||||
def pol(self, obj):
|
||||
"""Отображает поляризацию из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param and param.polarization:
|
||||
return param.polarization.name
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
if obj.parameter_obj.polarization:
|
||||
return obj.parameter_obj.polarization.name
|
||||
return "-"
|
||||
pol.short_description = "Поляризация"
|
||||
|
||||
def freq_range(self, obj):
|
||||
"""Отображает полосу частот из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param:
|
||||
return param.freq_range
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
return obj.parameter_obj.freq_range
|
||||
return "-"
|
||||
freq_range.short_description = "Полоса, МГц"
|
||||
freq_range.admin_order_field = "parameters_obj__freq_range"
|
||||
freq_range.admin_order_field = "parameter_obj__freq_range"
|
||||
|
||||
def bod_velocity(self, obj):
|
||||
"""Отображает символьную скорость из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param:
|
||||
return param.bod_velocity
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
return obj.parameter_obj.bod_velocity
|
||||
return "-"
|
||||
bod_velocity.short_description = "Сим. v, БОД"
|
||||
|
||||
def modulation(self, obj):
|
||||
"""Отображает модуляцию из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param and param.modulation:
|
||||
return param.modulation.name
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
if obj.parameter_obj.modulation:
|
||||
return obj.parameter_obj.modulation.name
|
||||
return "-"
|
||||
modulation.short_description = "Модуляция"
|
||||
|
||||
def snr(self, obj):
|
||||
"""Отображает отношение сигнал/шум из связанного параметра."""
|
||||
param = next(iter(obj.parameters_obj.all()), None)
|
||||
if param:
|
||||
return param.snr
|
||||
if hasattr(obj, 'parameter_obj') and obj.parameter_obj:
|
||||
return obj.parameter_obj.snr
|
||||
return "-"
|
||||
snr.short_description = "ОСШ"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user