我正在试图弄清楚如何设计我的模型。我一直在浏览文档,最终看起来我应该使用“通过”属性,但我无法弄清楚如何让它按照我想要的方式工作。
如果有人可以看一看并指出我缺少的东西,那将非常有帮助。我在下面粘贴了我的模型。
这就是我想要做的事情:
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”部分最后一次用于此特定资产的时间。
答案 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”部分最后一次使用的日期。