diff --git a/lpon_site/frontend/models.py b/lpon_site/frontend/models.py index aa03a7f..5a1f3d2 100644 --- a/lpon_site/frontend/models.py +++ b/lpon_site/frontend/models.py @@ -235,6 +235,9 @@ class TbImageMetadata(models.Model): • offer.m_image.all() — все картинки оффера • offer.m_image.all().order_by('i_img_sort') — отсортированные картинки • image.metadata (через related_name) — доступ к метаданным + + МЕТОДЫ: + • Нет переопределённых методов save(). Используется стандартное поведение Django. """ image = FilerImageField( @@ -582,6 +585,11 @@ class TbMusicStyle(models.Model): Связи: • M2M←TbArticle.k_article_to_styles: теги стилей к статьям • M2M←TbItem.k_item_to_style: жанры альбомов + + МЕТОДЫ: + • save(): управляет синонимами и создаёт связанную статью автоматически + - При создании/изменении: добавляет название стиля в SYN_EN метаданные + - Если статья не привязана: создаёт новую через create_or_get_related_article() """ # Используем SmallAutoField для оптимизации (макс ~32k) # Стилей обычно 100-1000, поэтому 2 байта достаточно @@ -676,6 +684,11 @@ class TbArtist(models.Model): Связи: • M2M←TbItem.k_item_to_artist: коллаборации (артист может быть на нескольких альбомах) + + МЕТОДЫ: + • save(): управляет синонимами и создаёт связанную статью автоматически + - При создании/изменении: добавляет названия артиста в SYN_EN метаданные + - Если статья не привязана: создаёт новую через create_or_get_related_article() """ # Используем SmallAutoField для оптимизации (макс ~32k) # Артистов в базе может быть несколько тысяч, достаточно @@ -776,6 +789,11 @@ class TbItem(models.Model): • Один товар может быть в нескольких TbOffer от разных продавцов • M2M с TbArtist для поддержки коллабораций • M2M с TbMusicStyle для жанров + + МЕТОДЫ: + • save(): управляет синонимами и создаёт связанную статью автоматически + - При создании/изменении: добавляет названия товара в SYN_EN метаданные + - Если статья не привязана: создаёт новую через create_or_get_related_article() """ s_item = models.CharField( max_length=128, @@ -913,6 +931,11 @@ class TbLabel(models.Model): Связи: • 1:M←TbOffer.k_offer_to_label: предложения от этого лейбла + + МЕТОДЫ: + • save(): управляет синонимами и создаёт связанную статью автоматически + - При создании/изменении: добавляет названия лейбла в SYN_EN метаданные + - Если статья не привязана: создаёт новую через create_or_get_related_article() """ # Используем SmallAutoField для оптимизации (макс ~32k) # Лейблов обычно несколько сотен-тысяч, достаточно @@ -1016,6 +1039,10 @@ class TbSeller(models.Model): Связи: • 1:M→TbSource.k_source_to_seller: источники данных от этого продавца • 1:M→TbOffer (через TbSource): предложения товаров + + МЕТОДЫ: + • save(): создаёт связанную статью автоматически (синонимы не используются) + - Если статья не привязана: создаёт новую через create_or_get_related_article() """ class SellerType(models.TextChoices): SELLER = 'seller', 'Продавец' @@ -1467,6 +1494,9 @@ class TbSource(models.Model): Связи: • 1:M→TbOffer.k_offer_to_source: офферы из этого источника + + МЕТОДЫ: + • Нет переопределённых методов save(). Используется стандартное поведение Django. """ class SourceType(models.TextChoices): EXCEL = 'excel', 'Excel-файл от продавца или издателя' @@ -1570,6 +1600,9 @@ class TbOfferHistory(models.Model): - Поле t_history_created можно редактировать (editable=True) - Используется для импорта исторических данных из Excel-файлов и других источников - Позволяет восстановить временную линию цены/наличия для аналитики + + МЕТОДЫ: + • save(): вызывается автоматически из TbOffer.save() с параметрами цены/количества """ k_history_to_offer = models.ForeignKey( TbOffer,