Автонаименование категории при добавлении товара. Django
Основной вопрос это как организовать создание товара через админ панель с автонаименованием? Думаю по коду будет понятно.
В файле models.py я определяю отдельный класс для каждой категории, из-за специфических характеристик:
class BaseProductInfo(models.Model):
title = models.CharField(max_length=24, verbose_name='Название')
manufacturer = models.CharField(max_length=24, verbose_name='Производитель')
photo = models.ImageField(upload_to="photos/", verbose_name='Фото')
description = models.TextField(blank=True, verbose_name='Описание')
included = models.CharField(max_length=24, verbose_name='Комплектация')
created = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
updated = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
category = models.ForeignKey('ProductCategory', on_delete=models.PROTECT)
price = models.CharField(max_length=24, verbose_name='Цена')
def __str__(self):
return self.title
class Motherboard(BaseProductInfo, models.Model):
form_factor = models.CharField(max_length=24)
chipset = models.CharField(max_length=24)
ddr_version = models.CharField(max_length=24)
m2_slots = models.CharField(max_length=24)
class Videocard(BaseProductInfo, models.Model):
memory = models.CharField(max_length=24, verbose_name='Объём памяти')
ddr_version = models.CharField(max_length=24, verbose_name='Тип памяти')
bitness = models.CharField(max_length=24, verbose_name='Битность шины')
frequency = models.CharField(max_length=24, verbose_name='Частота GPU')
class ProductCategory(models.Model):
name = models.CharField(max_length=100, db_index=True)
def __str__(self):
return self.name
Хочу чтобы админ регистрируя товар, не выбирал категорию. Например, занося в админ панели товар 'Videocard' выбиралась указанная категория из бд.
Вторичный вопрос - правильно ли я подхожу к реализации?
Ответы (1 шт):
Я не до конца понял вопрос, но если вы хотите автоматически проставлять категорию, исхрдя из названия товара, то можно это сделать примерно так:
# service.py
def save_product(product_data):
keywords = {
'motherboard': Motherboard,
'videocard': Videocard,
'': BaseProductInfo,
}
for word in keywords:
if word in product_data.title:
ProductModel = keywords[word]
break
product = ProductModel(**product_data)
product.save()
# models.py
class BaseProductInfo(models.Model):
title = models.CharField(max_length=24, verbose_name='Название')
class Motherboard(BaseProductInfo):
chipset = models.CharField(max_length=24)
class Videocard(Videocard):
memory = models.CharField(max_length=24, verbose_name='Объём памяти')
Также, если я не ошибаюсь, вам не нужно ставить models.Model у подмоделей, тк класс BaseProductInfo уже наследуется от неё.
P.S. Интересный вопрос, оказалось, что я не совсем правильно знал, как наследуются модели в django. Ссылка для чтения
P.P.S. Возможно, я где-то ошибся в синтаксисе/вызове методов, но, думаю, разберётесь, здесь идея, как можно это реализовать, а не конечная реализация.
UPDATE
Возможно, более правильным будет сделать такую архитектуру хранения характеристик:
class ProductParameterType(Model):
class ValueType:
types = {
0: 'string',
2: 'integer',
}
name = CharField
value_type = IntegerField(choices=ValueType.types)
class ProductType(Model):
name = CharField
parameters = ManyToMany(ProductParameterType)
class Product(Model):
name = CharField
product_type = ForeignKey(ProductType)
class ProductParameter(Model):
product_type = ForeignKey(ProductType)
product = ForeignKey(Product)
value = CharField