Переделал модель Parameter и связь с ObjItem
This commit is contained in:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user