Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 了解如何设计我的模型并使用;透过「;_Django_Django Models - Fatal编程技术网

Django 了解如何设计我的模型并使用;透过「;

Django 了解如何设计我的模型并使用;透过「;,django,django-models,Django,Django Models,我想知道如何设计我的模型。我已经阅读了文档,最终似乎我应该使用“through”属性,但我就是不知道如何让它按照我想要的方式工作 如果有人能看一看并指出我遗漏了什么,那将非常有帮助。我已经把我的模型贴在下面了 这就是我想做的: 1) 有一个服务器类型列表 2) 每种服务器类型都需要为该特定服务器类型提供不同的部件 3) 该资源对服务器模型具有FK,对特定于该服务器类型的部件具有M2M 我的问题是,每个“资产”如何存储特定于该“资产”的每个“部分”的元数据?例如,每个“资产”都应该有分配给它的零件

我想知道如何设计我的模型。我已经阅读了文档,最终似乎我应该使用“through”属性,但我就是不知道如何让它按照我想要的方式工作

如果有人能看一看并指出我遗漏了什么,那将非常有帮助。我已经把我的模型贴在下面了

这就是我想做的:

1) 有一个服务器类型列表

2) 每种服务器类型都需要为该特定服务器类型提供不同的部件

3) 该资源对服务器模型具有FK,对特定于该服务器类型的部件具有M2M

我的问题是,每个“资产”如何存储特定于该“资产”的每个“部分”的元数据?例如,每个“资产”都应该有分配给它的零件的上次使用的数据

谢谢!:)

编辑: 谢谢你的帮助

不过,我可能还没有解释清楚。可能是我混淆了模特的名字

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

应为“Dell Server 2000”分配特定部件: “RAM” “硬盘” “光盘”


然后,我应该能够创建10倍于服务器模型的FK资产。现在,这些资产中的每一项都应该能够标记“RAM”部分最后一次用于该特定资产的时间。

我不确定我是否完全理解您想要做什么,但基本上您可以使用“直通”模型来解决这一问题,正如您所期望的:

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”-属性的每个部件实例,将创建一个新的资产实例(Phew-希望这听起来不太复杂)。在创建资产实例时,资产实例的“used”属性被设置为当前日期和时间(这就是默认值=datetime.datetime.now()的作用)

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

ServerModel.objects.filter(parts__name='ThePartYouAreLookingFor').order_by('asset__used')
我不能绝对确定queryset是否正确,因此如果有人发现其中存在大量废话,请随意编辑;)

编辑: 上面的模型并不完全如此。但您甚至不需要一个完整的模型来满足您的需求:

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”部件的最后一次使用日期。

这不太正确。
模型必须具有多个关系的两个表的外键。谢谢。更新以反映这一点。使用第一种方法。谢谢
Asset.objects.filter(parts__contains='RAM').order_by('used')