弄清楚如何设计我的模型并使用“通过”

时间:2012-03-05 14:51:23

标签: django django-models

我正在试图弄清楚如何设计我的模型。我一直在浏览文档,最终看起来我应该使用“通过”属性,但我无法弄清楚如何让它按照我想要的方式工作。

如果有人可以看一看并指出我缺少的东西,那将非常有帮助。我在下面粘贴了我的模型。

这就是我想要做的事情:

1)拥有服务器类型列表

2)每种服务器类型都需要具有可用于该特定服务器类型的不同部分

3)资产与服务器模型有一个FK,它具有特定于该服务器类型的部分的M2M。

我的问题是,每个“资产”如何存储特定于该“资产”的每个“部分”的元数据?例如,每个“资产”应该拥有它自己的last_used数据,用于分配给它的部分。

谢谢! :)

class Part(models.Model):
    part_description = models.CharField(max_length=30,unique=1)
    last_used = models.CharField(max_length=30)
    def __unicode__(self):
        return self.part_description

class ServerModel(models.Model):
    server_model = models.CharField(max_length=30,unique=1)
    parts = models.ManyToManyField(Part)
    def __unicode__(self):
        return self.server_model

class Asset(models.Model):
    server_model = models.ForeignKey(ServerModel)
    serial_number = models.CharField(max_length=10,unique=1)
    def __unicode__(self):
        return self.server_model.server_model

编辑: 谢谢你的帮助!

但是,我可能没有清楚地解释过自己。这可能是我令人困惑的模特名字。

实施例: ServerModel存储正在使用的服务器类型,例如“Dell Server 2000”。

应为“Dell Server 2000”分配特定部分: “内存” “硬盘” “CDROM”

然后,我应该能够使用FK向ServerModel创建10x资产。现在,这些资产中的每一个都应该能够标记“RAM”部分最后一次用于此特定资产的时间。

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你想要做什么,但基本上你可以通过“通过”模式解决这个问题,正如你所期望的那样:

import datetime

class Part(models.Model):
    name = models.CharField(max_length=30,unique=1)

class ServerModel(models.Model):
    server_model = models.CharField(max_length=30,unique=1)
    parts = models.ManyToManyField(Part,through='Asset')

class Asset(models.Model):
    server_model = models.ForeignKey(ServerModel)
    part = models.ForeignKey(Part)
    serial_number = models.CharField(max_length=10,unique=1)
    used = models.DateTimeField(default=datetime.datetime.now())

首先要注意的是使用“through”-model将部件与servermodel的关系:对于分配给ServerModel实例的“parts”属性的每个Part实例,创建一个新的Asset实例(Phew) - 希望听起来不太复杂)。在创建时,Asset实例的“used”属性被设置为当前日期和时间(这就是default = datetime.datetime.now()的作用)。

如果您这样做,则可以只在数据库中查询包含您零件的最后一个资产。然后,可以通过Asset模型的“used”属性对该查询集进行排序,该属性是创建Asset实例的日期。

ServerModel.objects.filter(parts__name='ThePartYouAreLookingFor').order_by('asset__used')

我不确定查询集是否正确,所以如果有人发现其中有大量废话,请随时编辑;)

修改 上面的模型并不完全是这样。但是你甚至不需要你想要的直通模型:

class ServerModel(models.Model):
    server_model = models.CharField(max_length=30,unique=1)
    parts = models.ManyToManyField(Part)

class Asset(models.Model):
    server_model = models.ForeignKey(ServerModel)
    parts = models.ForeignKey(Part)
    serial_number = models.CharField(max_length=10,unique=1)
    used = models.DateTimeField(default=datetime.datetime.now())

基本上,您只需添加资产,然后查询部分具有RAM的所有资产。

Asset.objects.filter(parts__contains='RAM').order_by('used')

获取该查询集的第一个(或最后一个)结果的日期,并获得“RAM”部分最后一次使用的日期。