""" Модель точки ГЛ (ObjItem). """ from django.db import models from django.utils import timezone class ObjItemQuerySet(models.QuerySet): """Custom QuerySet для модели ObjItem с оптимизированными запросами""" def with_related(self): """Оптимизирует запросы, загружая связанные объекты""" return self.select_related( "geo_obj", "updated_by__user", "created_by__user", "lyngsat_source", "parameter_obj", "parameter_obj__id_satellite", "parameter_obj__polarization", "parameter_obj__modulation", "parameter_obj__standard", ) def recent(self, days=30): """Возвращает объекты, созданные за последние N дней""" from datetime import timedelta cutoff_date = timezone.now() - timedelta(days=days) return self.filter(created_at__gte=cutoff_date) def by_user(self, user): """Возвращает объекты, созданные указанным пользователем""" return self.filter(created_by=user) class ObjItemManager(models.Manager): """Custom Manager для модели ObjItem""" def get_queryset(self): return ObjItemQuerySet(self.model, using=self._db) def with_related(self): """Возвращает queryset с предзагруженными связанными объектами""" return self.get_queryset().with_related() def recent(self, days=30): """Возвращает недавно созданные объекты""" return self.get_queryset().recent(days) def by_user(self, user): """Возвращает объекты пользователя""" return self.get_queryset().by_user(user) class ObjItem(models.Model): """ Модель точки ГЛ. Центральная модель, объединяющая информацию о ВЧ параметрах, геолокации. """ # Основные поля name = models.CharField( null=True, blank=True, max_length=100, verbose_name="Имя объекта", db_index=True, help_text="Название объекта/источника сигнала", ) source = models.ForeignKey( 'mainapp.Source', on_delete=models.CASCADE, null=True, verbose_name="ИРИ", related_name="source_objitems", ) transponder = models.ForeignKey( "mapsapp.Transponders", on_delete=models.SET_NULL, related_name="transponder_objitems", null=True, blank=True, verbose_name="Транспондер", help_text="Транспондер, с помощью которого была получена точка", ) is_automatic = models.BooleanField( default=False, verbose_name="Автоматическая", db_index=True, help_text="Если True, точка не добавляется к объектам (Source), а хранится отдельно", ) # Метаданные created_at = models.DateTimeField( auto_now_add=True, verbose_name="Дата создания", help_text="Дата и время создания записи", ) created_by = models.ForeignKey( 'mainapp.CustomUser', on_delete=models.SET_NULL, related_name="objitems_created", null=True, blank=True, verbose_name="Создан пользователем", help_text="Пользователь, создавший запись", ) updated_at = models.DateTimeField( auto_now=True, verbose_name="Дата последнего изменения", help_text="Дата и время последнего изменения", ) updated_by = models.ForeignKey( 'mainapp.CustomUser', on_delete=models.SET_NULL, related_name="objitems_updated", null=True, blank=True, verbose_name="Изменен пользователем", help_text="Пользователь, последним изменивший запись", ) lyngsat_source = models.ForeignKey( "lyngsatapp.LyngSat", on_delete=models.SET_NULL, related_name="objitems", null=True, blank=True, verbose_name="Источник LyngSat", help_text="Связанный источник из базы LyngSat (ТВ)", ) # Custom manager objects = ObjItemManager() def __str__(self): return f"Объект {self.name}" if self.name else f"Объект #{self.pk}" class Meta: verbose_name = "Объект" verbose_name_plural = "Объекты" ordering = ["-updated_at"] indexes = [ models.Index(fields=["name"]), models.Index(fields=["-updated_at"]), models.Index(fields=["-created_at"]), ]