Добавлена автогенерация артикулов вариантов для ConfigurableProduct
Добавлено поле variant_sku в модель ConfigurableProductOption. Артикул варианта генерируется автоматически в формате VAR-XXXXXX-V1, VAR-XXXXXX-V2 и т.д. Счетчик не переиспользуется при удалении вариантов для защиты интеграций. Переименован property variant_sku в variant_base_sku для основного SKU. Обновлен шаблон с колонкой артикула варианта. Создана миграция для добавления поля и data migration для существующих записей. Назначение: дополнительный артикул для интеграций с внешними площадками.
This commit is contained in:
22
myproject/products/migrations/0003_add_variant_sku.py
Normal file
22
myproject/products/migrations/0003_add_variant_sku.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 5.0.10 on 2025-12-30 08:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('products', '0002_add_configurable_sku_counter'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='configurableproductoption',
|
||||
name='variant_sku',
|
||||
field=models.CharField(blank=True, help_text='Дополнительный артикул для внешних площадок. Генерируется автоматически.', max_length=50, verbose_name='Артикул варианта'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='configurableproductoption',
|
||||
index=models.Index(fields=['variant_sku'], name='products_co_variant_2da938_idx'),
|
||||
),
|
||||
]
|
||||
41
myproject/products/migrations/0004_populate_variant_sku.py
Normal file
41
myproject/products/migrations/0004_populate_variant_sku.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Generated by Django 5.0.10 on 2025-12-30 08:17
|
||||
|
||||
import re
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def populate_variant_sku(apps, schema_editor):
|
||||
"""
|
||||
Генерируем variant_sku для существующих вариантов.
|
||||
Формат: {parent.sku}-V{counter}
|
||||
"""
|
||||
ConfigurableProductOption = apps.get_model('products', 'ConfigurableProductOption')
|
||||
ConfigurableProduct = apps.get_model('products', 'ConfigurableProduct')
|
||||
|
||||
# Получаем все родительские товары
|
||||
for parent in ConfigurableProduct.objects.all():
|
||||
# Получаем все варианты этого родителя
|
||||
options = ConfigurableProductOption.objects.filter(parent=parent).order_by('id')
|
||||
|
||||
for idx, option in enumerate(options, start=1):
|
||||
# Генерируем variant_sku только если он пустой
|
||||
if not option.variant_sku:
|
||||
option.variant_sku = f"{parent.sku}-V{idx}"
|
||||
option.save(update_fields=['variant_sku'])
|
||||
|
||||
|
||||
def reverse_populate(apps, schema_editor):
|
||||
"""Очистка variant_sku при откате миграции"""
|
||||
ConfigurableProductOption = apps.get_model('products', 'ConfigurableProductOption')
|
||||
ConfigurableProductOption.objects.all().update(variant_sku='')
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('products', '0003_add_variant_sku'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(populate_variant_sku, reverse_populate),
|
||||
]
|
||||
Reference in New Issue
Block a user