RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1296089
Accepted
betepok
betepok
Asked:2022-06-17 05:21:01 +0000 UTC2022-06-17 05:21:01 +0000 UTC 2022-06-17 05:21:01 +0000 UTC

添加产品时的类别自动命名。姜戈

  • 772

主要问题是如何通过带有自动名称的管理面板组织商品的创建?我认为代码会很清楚。

在 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”,从数据库中选择了指定的类别。

第二个问题 - 我是否正确地接近实施?

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Michael Tetelev
    2022-06-17T16:21:42Z2022-06-17T16:21:42Z

    我没有完全理解这个问题,但是如果你想根据产品名称自动放下一个类别,那么你可以这样做:

    # 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已经继承了它。

    PS 有趣的问题,原来我不太清楚模型是如何在 django 中继承的。 阅读链接

    PPS 也许我在语法/调用方法的某个地方犯了错误,但我想你会弄清楚的,这里是一个如何实现的想法,而不是最终的实现。

    更新

    或许用这样的架构来存储特征会更正确:

    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
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5