Переделал модель Parameter и связь с ObjItem

This commit is contained in:
2025-11-10 22:32:26 +03:00
parent b24ef940ce
commit 1b345a3fd9
9 changed files with 535 additions and 447 deletions

View File

@@ -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 = "ОСШ"