fin: модели (18) полные комментарии с подробным описанием полей и механики цепочки методов, когда save одной модели создает или изменяет записи в других моделях...

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