rework objitem model

This commit is contained in:
2025-10-31 12:08:47 +03:00
parent 20a13414de
commit 6df48deb3c
9 changed files with 74 additions and 79 deletions

View File

@@ -98,6 +98,8 @@ class GeoInline(admin.StackedInline):
verbose_name_plural = "Гео"
form = LocationForm
readonly_fields = ("distance_coords_kup", "distance_coords_valid", "distance_kup_valid")
prefetch_related = ("mirrors",)
autocomplete_fields = ('mirrors',)
fieldsets = (
("Основная информация", {
"fields": ("mirrors", "location", "distance_coords_kup",
@@ -223,7 +225,7 @@ class ParameterAdmin(ImportExportActionModelAdmin, admin.ModelAdmin):
)
ordering = ("frequency",)
list_select_related = ("polarization", "modulation", "standard", "id_satellite",)
filter_horizontal = ('objitems',) # For many-to-many relationship
autocomplete_fields = ('objitems',)
# raw_id_fields = ("id_sigma_parameter", )
inlines = [SigmaParameterInline]
# autocomplete_fields = ("id_sigma_parameter", )
@@ -402,44 +404,17 @@ def show_on_map(modeladmin, request, queryset):
show_on_map.short_description = "Показать выбранные на карте"
class ObjItemForm(forms.ModelForm):
parameter = forms.ModelChoiceField(
queryset=Parameter.objects.all(),
required=False,
label="Параметр"
)
class Meta:
model = ObjItem
fields = '__all__'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Set initial value if the ObjItem already has a parameter
if self.instance.pk:
first_param = self.instance.parameters_obj.first()
if first_param:
self.fields['parameter'].initial = first_param
def save(self, commit=True):
instance = super().save(commit=commit)
# Handle the single parameter assignment - replace all existing relationships
if self.cleaned_data.get('parameter'):
# Clear all existing parameter relationships
instance.parameters_obj.clear()
# Add the selected parameter
instance.parameters_obj.add(self.cleaned_data['parameter'])
else:
# If no parameter selected, clear all
instance.parameters_obj.clear()
return instance
class ParameterObjItemInline(admin.StackedInline):
model = ObjItem.parameters_obj.through
extra = 0
max_num = 1
verbose_name = "ВЧ загрузка"
verbose_name_plural = "ВЧ загрузки"
@admin.register(ObjItem)
class ObjectAdmin(admin.ModelAdmin):
form = ObjItemForm
list_display = (
"name",
"sat_name",
@@ -475,9 +450,11 @@ class ObjectAdmin(admin.ModelAdmin):
)
ordering = ("name",)
inlines = [GeoInline]
inlines = [ParameterObjItemInline, GeoInline]
actions = [show_on_map]
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('geo_obj').prefetch_related(