Переделал модель 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

@@ -163,16 +163,6 @@ def fill_data_from_df(df: pd.DataFrame, sat: Satellite, current_user=None):
source = stroka[1]["Объект наблюдения"]
user_to_use = current_user if current_user else CustomUser.objects.get(id=1)
vch_load_obj, _ = Parameter.objects.get_or_create(
id_satellite=sat,
polarization=polarization_obj,
frequency=freq,
freq_range=freq_line,
bod_velocity=v,
modulation=mod_obj,
snr=snr,
)
geo, _ = Geo.objects.get_or_create(
timestamp=timestamp,
coords=geo_point,
@@ -187,14 +177,40 @@ def fill_data_from_df(df: pd.DataFrame, sat: Satellite, current_user=None):
geo.save()
geo.mirrors.set(Mirror.objects.filter(name__in=current_mirrors))
existing_obj_items = ObjItem.objects.filter(
parameters_obj=vch_load_obj, geo_obj=geo
# Check if ObjItem with same geo already exists
existing_obj_item = ObjItem.objects.filter(geo_obj=geo).first()
if existing_obj_item:
# Check if parameter with same values exists for this object
if (
hasattr(existing_obj_item, 'parameter_obj') and
existing_obj_item.parameter_obj and
existing_obj_item.parameter_obj.id_satellite == sat and
existing_obj_item.parameter_obj.polarization == polarization_obj and
existing_obj_item.parameter_obj.frequency == freq and
existing_obj_item.parameter_obj.freq_range == freq_line and
existing_obj_item.parameter_obj.bod_velocity == v and
existing_obj_item.parameter_obj.modulation == mod_obj and
existing_obj_item.parameter_obj.snr == snr
):
# Skip creating duplicate
continue
# Create new ObjItem and Parameter
obj_item = ObjItem.objects.create(name=source, created_by=user_to_use)
vch_load_obj = Parameter.objects.create(
id_satellite=sat,
polarization=polarization_obj,
frequency=freq,
freq_range=freq_line,
bod_velocity=v,
modulation=mod_obj,
snr=snr,
objitem=obj_item
)
if not existing_obj_items.exists():
obj_item = ObjItem.objects.create(name=source, created_by=user_to_use)
obj_item.parameters_obj.set([vch_load_obj])
geo.objitem = obj_item
geo.save()
geo.objitem = obj_item
geo.save()
def add_satellite_list():
@@ -316,14 +332,6 @@ def get_points_from_csv(file_content, current_user=None):
mir_3_obj, _ = Mirror.objects.get_or_create(name=row["mir_3"])
user_to_use = current_user if current_user else CustomUser.objects.get(id=1)
vch_load_obj, _ = Parameter.objects.get_or_create(
id_satellite=sat_obj,
polarization=pol_obj,
frequency=row["freq"],
freq_range=row["f_range"],
# defaults={'id_user_add': user_to_use}
)
geo_obj, _ = Geo.objects.get_or_create(
timestamp=row["time"],
coords=Point(row["lon"], row["lat"], srid=4326),
@@ -334,14 +342,34 @@ def get_points_from_csv(file_content, current_user=None):
)
geo_obj.mirrors.set(Mirror.objects.filter(name__in=mir_lst))
existing_obj_items = ObjItem.objects.filter(
parameters_obj=vch_load_obj, geo_obj=geo_obj
# Check if ObjItem with same geo already exists
existing_obj_item = ObjItem.objects.filter(geo_obj=geo_obj).first()
if existing_obj_item:
# Check if parameter with same values exists for this object
if (
hasattr(existing_obj_item, 'parameter_obj') and
existing_obj_item.parameter_obj and
existing_obj_item.parameter_obj.id_satellite == sat_obj and
existing_obj_item.parameter_obj.polarization == pol_obj and
existing_obj_item.parameter_obj.frequency == row["freq"] and
existing_obj_item.parameter_obj.freq_range == row["f_range"]
):
# Skip creating duplicate
continue
# Create new ObjItem and Parameter
obj_item = ObjItem.objects.create(name=row["obj"], created_by=user_to_use)
vch_load_obj = Parameter.objects.create(
id_satellite=sat_obj,
polarization=pol_obj,
frequency=row["freq"],
freq_range=row["f_range"],
objitem=obj_item
)
if not existing_obj_items.exists():
obj_item = ObjItem.objects.create(name=row["obj"], created_by=user_to_use)
obj_item.parameters_obj.set([vch_load_obj])
geo_obj.objitem = obj_item
geo_obj.save()
geo_obj.objitem = obj_item
geo_obj.save()
def get_vch_load_from_html(file, sat: Satellite) -> None:
@@ -598,29 +626,22 @@ def parse_pagination_params(
def get_first_param_subquery(field_name: str):
"""
Создает подзапрос для получения первого параметра объекта.
Возвращает F() выражение для доступа к полю параметра через OneToOne связь.
Используется для аннотации queryset с полями из связанной модели Parameter.
Возвращает значение указанного поля из первого параметра объекта.
После рефакторинга связи Parameter-ObjItem с ManyToMany на OneToOne,
эта функция упрощена для возврата прямого F() выражения вместо подзапроса.
Args:
field_name (str): Имя поля модели Parameter для извлечения.
Может включать связанные поля через __ (например, 'id_satellite__name').
Returns:
Subquery: Django Subquery объект для использования в annotate().
F: Django F() объект для использования в annotate().
Example:
>>> from django.db.models import Subquery, OuterRef
>>> freq_subq = get_first_param_subquery('frequency')
>>> objects = ObjItem.objects.annotate(first_freq=Subquery(freq_subq))
>>> freq_expr = get_first_param_subquery('frequency')
>>> objects = ObjItem.objects.annotate(first_freq=freq_expr)
>>> for obj in objects:
... print(obj.first_freq)
"""
from django.db.models import OuterRef
return (
Parameter.objects.filter(objitems=OuterRef("pk"))
.order_by("id")
.values(field_name)[:1]
)
return F(f"parameter_obj__{field_name}")