与ORM django和sqlite3数据库相关的问题

Posted

技术标签:

【中文标题】与ORM django和sqlite3数据库相关的问题【英文标题】:Question related ORM django and sqlite3 database 【发布时间】:2020-07-15 16:33:35 【问题描述】:

我正在创建一个 BOM 应用程序来为我们的 IT 网络部门生成一个用于物料清单的 PDF 文件。我需要有关数据库结构和外键的帮助来建立 ORM。基于这些模型,我创建了表单,该表单将接受 IT 用户的输入并使用以下模型 click here 计算该实例的 BOM。在这里,我们可以有不同的供应商,每个供应商都有不同的设备模型类型,其中包括应该相互关联以利用 DRY 原则和 ORM 映射等的部件/项目。任何基本布局都应该在这方面有所帮助。

任何想法对我来说都是一个很好的开始,因为我是网络架构师,在编程领域没有很多经验,刚开始接触 python 编码和学习 django。

class CiscoModel(models.Model):
    router_switch_type =  models.CharField(max_length=50)

    def __str__(self):
        return self.router_switch_type
class CiscoParts(models.Model):
    model = models.ForeignKey(CiscoModel, on_delete=None)
    part_number = models.CharField(max_length=50)
    voice = models.BooleanField(default=False)
    desc = models.CharField(max_length=200)
    service_duration = models.IntegerField(blank=True, null=True)
    unit_list_price = models.FloatField()
    qty = models.IntegerField()
    unit_net_price = models.FloatField(blank=True, null=True)
    discount = models.IntegerField(blank=True, null=True)
    extended_net_price = models.FloatField()

    def __str__(self):
        return self.part_number

class RuckusModel(models.Model):
    switch_type = models.CharField(max_length=50)

    def __str__(self):
        return self.switch_type

class RuckusParts(models.Model):
    model = models.ForeignKey(RuckusModel, on_delete=None)
    sku = models.CharField(max_length=50)
    desc = models.CharField(max_length=200)
    service_duration = models.IntegerField()
    unit_list_price = models.FloatField()
    qty = models.IntegerField()
    unit_net_price = models.FloatField()
    discount = models.IntegerField()
    extended_net_price = models.FloatField()

【问题讨论】:

【参考方案1】:

对于初学者 确定您的业务参与者。 每个业务参与者都是一个类

例如:

Device (Physical Device Unit)
DeviceModel (Product form a vendor)
DevicePart (Parts form a vendor)
Vendor (Indevidual Vendor)

DeviceModel 可以有多个 0 到 Multiple Parts 并且 1 Part 可以属于多个 DeviceModels 所以在 DeviceModel 和 DevicePart 之间建立一个多对多的关系 M2M In Django

然后供应商可以表这将与 DeviceModel 和 DevicePart 表都有外键关系,以便您能够识别谁是单个 DeviceModel 和 DevicePart 的供应商

Last You Device 表将具有与单个设备相关的属性,例如序列号、所有者、价格,以及对 DeviceModel 的外键引用

您可以将库存报告导出为数据库视图

【讨论】:

感谢您的回复。我带来了您提到的模型,如下面的代码 sn-p 所示。但是我仍然有几个与此相关的问题,我在想 DevicePart 应该有定价信息,因为每个部分都会有定价,如果我们将 DevicePart 作为外键,那么在 Device 上,这将是有意义的,因为 Device 由多个具有定价的部分组成在每个部分,那么我们如何计算该设备的总价格。 您在设备和设备部件之间存在 m2m 关系,因此您可以通过添加映射到设备的每个部件的定价来计算总设备价格以同样的方式,假设您有 5 个型号为“M”的设备而 Modal M 由 10 个独立部件组成,因此 5 台设备的定价将是共同的,因此总成本应该是 Modal 而不是单个设备【参考方案2】:
class DeviceModel(models.Model):
    device_model = models.CharField(max_length=50)

class Device(models.Model):
    device_model = models.ForeignKey(DeviceModel, on_delete=None)
    sku = models.CharField(max_length=50)
    desc = models.CharField(max_length=200)
    service_duration = models.IntegerField()
    unit_list_price = models.FloatField()
    unit_net_price = models.FloatField()
    discount = models.IntegerField()
    extended_net_price = models.FloatField()

class DevicePart(models.Model):
    device_model = models.ManyToManyField(DeviceModel)
    part_number = models.CharField(max_length=50, blank=True, null=True)
    part_description = models.CharField(max_length=200, blank=True, null=True)

    def __str__(self):
        return self.device_model


class Vendor(models.Model):
    ARISTA = 'Arista'
    CISCO = 'Cisco'
    RUCKUS = 'Ruckus'

    VENDOR_CHOICES = [
        (ARISTA, 'arista'),
        (CISCO, 'cisco'),
        (RUCKUS, 'ruckus'),
       ]
    vendor = models.CharField(
        max_length=2,
        choices=VENDOR_CHOICES,
        default=CISCO,
    )
    device_model = models.ForeignKey(DeviceModel, on_delete=None)
    device_part = models.ForeignKey(DevicePart, on_delete=None)

这有意义吗.....?

【讨论】:

【参考方案3】:

您在设备和设备部件之间存在 m2m 关系,因此您可以通过添加映射到设备的每个部件的定价来计算设备总价格

假设您有 5 台型号为“M”的设备,而 Modal M 由 10 个单独的部件组成,因此 5 台设备的定价是通用的,因此总成本应该是 Modal 而不是单独的设备

但是随着时间的推移,零件的价格会发生变化,您必须在设备进入系统期间跟踪设备的总价格

    我建议将定价信息添加到零件 Part 和 Modal 应该有 M2M 关系 该设备应该有一个额外的列来说明设备的总价格,因为部件的价格会在一段时间内不断变化,但一旦设备创建,其总成本就不太可能发生变化

【讨论】:

以上是关于与ORM django和sqlite3数据库相关的问题的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM 数据库设置和读写分离

Django ORM 数据库设置和读写分离

Django基础之数据库与ORM

Django之ORM

具有多个进程的 SOA 与 Django ORM

7. Django 2.1.7 基于默认sqlite3 模型设计 以及 数据操作