我为这个新手问题道歉,但我的头快要爆炸了。
我正在尝试学习 Django,并希望创建一些实用且我可以使用的东西。我用一个小型库存系统解决了这个问题。
我遇到的问题是找出模型之间建立关系以实现理想数据库设置的最佳方法。
我有以下模型:
- 折旧政策
- 制造商
- 客户/所有者
- Assets 类别(服务器、笔记本电脑等)
- Assets 模型(Macbook Pro、Proliant DL380 Gen 9 等)
- Assets 状态(已存档、已部署、丢失等)
- Assets 字段(所有 Assets 都会使用的通用字段) 有,型号(FK),状态(FK),购买日期等)
- CPU
- 服务器
- 网卡
现在我的服务器和网卡都继承了 Assets 字段。
我的目标是为每种类型的 Assets 建立一个表,但仍然有一个主表可以通过 FK 引用每种 Assets 类型的表,这样如果我想显示数据库中的所有 Assets ,我可以只列出一个表并拉取从相关表中获取相关信息,而不必查看每个 Assets 的表。
我想要这样的东西:
Assets 表:
<小时/>id(pk)、型号(fk)、状态(fk)、序列号、购买日期、成本、位置、server_id/network_card_id(fk)
服务器表:
<小时/>id(pk)、客户、名称、内存、cpu(fk)、ilo_type、ilo_lic
Assets 模型:
class Asset(models.Model):
# class Meta:
# abstract = True
assetTag = models.CharField(max_length=50, unique=True)
model = models.ForeignKey(AssetModel, on_delete=models.SET_NULL, null=True)
status = models.ForeignKey(AssetStatus, on_delete=models.SET_NULL, null=True)
serialNumber = models.CharField(max_length=50, unique=True)
purchaseDate = models.DateTimeField('Date order was placed', blank=True)
purchaseOrder = models.CharField(max_length=25, blank=True)
cost = models.DecimalField(default=0, max_digits=8, decimal_places=2, blank=True)
# location = models.CharField(max_length=25, blank=True, null=True)
def calculate_current_value(self, purchaseDate, cost):
purchase_price = float(cost)
months = self.model.depreciationPolicy.months
if months > 0:
days = months * 30
depreciation_per_day = (float(cost) / days)
days_owned = timezone.now() - purchaseDate
value_lost = days_owned.days * depreciation_per_day
current_asset_value = purchase_price - value_lost
return round(current_asset_value, 2)
def __str__(self):
return self.serialNumber
服务器型号:
class Server(Asset):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True)
memory = models.IntegerField(default=0)
cpu = models.ForeignKey(Cpu, on_delete=models.SET_NULL, null=True)
ILOType = models.CharField(max_length=50, choices=(('Std', 'Standard'), ('Adv', 'Advanced')))
ILOUsername = models.CharField(max_length=50, null=True, blank=True)
ILOPassword = models.CharField(max_length=100, null=True, blank=True)
ILOLicense = models.CharField(max_length=50, null=True, blank=True)
def __str__(self):
return self.serialNumber
网卡型号:
class Nic(Asset):
macAddress = models.CharField(max_length=100, unique=True)
portCount = models.IntegerField(default=0)
portType = models.CharField(max_length=50, choices=(('Ethernet', 'Ethernet'), ('Fiber', 'Fiber')))
def __str__(self):
return self.name
最佳答案
我建议您的第一件事是忘记表格。您处理的不是 Django 中的表,而是模型,它们是代表系统实体的类。模型稍后会变成表格,但您现在不必关心它们。
其次,仔细为你的类(class)建模。设计一个代表他们关系的漂亮图表。在您的场景中,一个类将包含对其他类(枢轴类)的引用,因此请对其进行建模。
另外,请花点时间阅读文档。 Django 是一个非常整洁和完整的文档。仔细阅读模型和查询集。您将了解在架构内表示事物所需的一切。
一些提示:
定义外部字段时,您将有很多选项,例如 ForeighKey()、ManyToManyField()、ManyToOneRel() 等。阅读每一个选项,然后选择代表您实际情况的选项最准确。
ManyToMany() 有一个有趣的行为,即:如果您不向它传递一个表,它会为您创建一个表,作为枢轴。我更喜欢创建中间表,因为它更符合 Python 的禅宗。
当您想要返回数据的连贯表示时,您必须使用查询集来强制执行模型中内置的关系,这与使用关系数据库的方式非常相似,通过构造查询或设计 View 。
这里有一些不错的链接:
- 字段:https://docs.djangoproject.com/en/1.10/ref/models/fields/
- 查询集:https://docs.djangoproject.com/en/1.10/topics/db/queries/
- Python 之禅:https://www.python.org/dev/peps/pep-0020/
此外,我强烈建议您在掌握了 Django 模型的基本概念后立即去看看 Django Rest Framework。链接如下:http://www.django-rest-framework.org/
当您有更具体的问题时,请回来找我。
祝你编码愉快!
关于mysql - Django 数据库关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42007484/