【问题标题】:Having one simple model for generic information and other that plug more fields in it拥有一个简单的通用信息模型和其他插入更多字段的模型
【发布时间】:2013-09-02 02:30:24
【问题描述】:

我有一个应用程序,人们可以在其中将他们的东西添加到目录中。现在的问题是,通用目录/列表模型只允许您添加基本产品信息,例如:

Title: My awesome laptop
Category: fk:123 (resolved: u'Electronics > Computers > Laptops')
Seller: fk: 1653 (resolved: u'DudeNobodyKnows')
PriceValue: 100 (resolved: u'100.00,-')
PriceCurrency: fk:15 (resolved: u'€ (EUR)')
DateAdded: 2013-09-02 (resolved: u'2nd September 2013')
Description: u'I just hate it and want to sell it.\
               I can give you a 10% off if you buy\
               this thing by 4rd September 2013.

               = Specs =
               CPU: Intel Core i7 2770k
               RAM: 64GiB DDR3 Dual-Channel ECC FB-DIMM 1666 MHz
               HDD: Kingston HyperX SSDNow V300 120 GiB

               Contact: +12 123456789
                        em@il.com'

等等

我希望这个= Specs = 部分完全位于笔记本电脑专用型号中。我希望这个目录是完全具体的。我希望查看者能够找到一些运行 Intel® 处理器的计算机,该处理器具有至少 2 个内核和至少 16 GiB 的 RAM 以及 10K HDD 或 SSD,并且屏幕尺寸不应大于 15 英寸等。我想要他能够将此信息输入到搜索表单中,我希望他能够找到这台笔记本电脑,因为它超出了他的要求(即使屏幕尺寸未知,但这只会将其移动到“未完全满足要求”部分)。

完成这项工作的最佳方法是什么?

我应该只为通用信息创建一个模型,然后在该模型中“插入”各个组件吗?就像有谁在出售它以及以什么价格(以及该信息)的报价,然后将单个项目添加为外键?在 Category 模型中包含此内容:id、title、parent(manytomany)、description 和 AllowedModels 也就是您可以放入该类别和它的孩子的东西(就像您不能将珠宝放入 Graphic Cards 类别一样)。然后为该应用程序中可能出售的每件东西制作一个模型,如笔记本电脑、汽车、螺栓、吉他、扬声器等,并制作另一批将扩展它们的子类别(如

Laptop: Thin Client
        Netbook
        ThoughBook
        Office Laptop
        General Purpose Laptop
        Multimedia Laptop
        Business Laptop
        Gaming Laptop
        Professional Laptop
        MacBook

等等

这是正确的方法吗?品牌也是如此(Apple 生产笔记本电脑、台式机、平板电脑、手机,但不生产钻头、锤子、汽车或马克杯)

在 PC 领域,进行大量预设(过去 10 年销售的所有 CPU 和 GPU 等)并将这些组件称为多对多键 - 您可以拥有一台具有 2 个 Xeon CPU 和 16 个 RAM 的计算机DIMM 和坏蛋 16 磁盘 SSD RAID 阵列,对吧?

这是将所有内容扩展和插入在一起的正确方法吗?还是将其保留在第一个示例中更好?

这是非常非常具体的方法吗?它会带来严重的性能影响吗?哦,我在 PostgreSQL 中做所有事情……

非常感谢您的回答!

【问题讨论】:

    标签: django postgresql django-models database-performance


    【解决方案1】:

    您是否研究过模型继承?

    如果没有,可能是时候阅读它了。 https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

    它们在实现级别的工作方式是,您定义一个包含所有基本细节的“基”类。

    一个非常简化的例子可能是这样的

    class Item(models.Model):
        name = models.CharField()
        price = models.CharField()
        location = models.CharField()
        catgegory = models.CharField()
    
        class Meta:
            abstract = True
    
    class Computer(Item):
        CPU = models.CharField()
        RAM = models.CharField()
        HDD = models.CharField()
    

    abstract = True 行表明 Django 不应该为其创建数据库表。它是其他类扩展的通用基类。

    因为 Computer 类继承自 Item 类,所以它可以访问其所有属性。您甚至可以将计算机类扩展为两个桌面类和笔记本电脑类。

    如果您还不了解继承,我强烈建议您阅读有关它的更多信息。维基百科总是一个很好的起点:)

    http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

    【讨论】:

    • 嗯,升级很快……我写了一篇文章,(可能的)答案很简单……
    • 其实如果你还不知道继承,我建议你读一读。它是面向对象语言的一个重要特征。我会更新我的答案以包含一个链接。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多