From f963d21b2651950cc4014514d518500eaf9c466a Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 15 Jul 2026 21:15:34 +0300 Subject: [PATCH] =?UTF-8?q?fin:=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20(?= =?UTF-8?q?18)=20=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD=D1=8B=D0=BC=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8=20=D1=86=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2,=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=B4=D0=B0=20save=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D0=B8=D0=BB=D0=B8=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=8F=D0=B5=D1=82=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D1=85=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D1=8F=D1=85...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lpon_site/frontend/models.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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,