2012-03-05 39 views
2

我想弄清楚如何設計我的模型。我一直在查閱文檔,最終看起來應該使用「through」屬性,但我無法弄清楚如何讓它按照我的想法工作。搞清楚如何設計我的模型,並使用「通過」

如果有人可以看一看並指出我錯過了什麼,那會非常有幫助。下面粘貼了我的模型。

這就是我要做的:

1)具有服務器類型的列表

2)每個服務器類型需要有提供給特定的服務器類型

不同部位3)資產具有FK到服務器模型,其具有到特定於該服務器類型的部分的M2M。

我的問題是,每個「資產」如何存儲特定於該「資產」的每個「部分」的元數據?例如,每個「資產」應該爲其分配的部分擁有自己的最後使用的數據。

謝謝! :)

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」。

的 「戴爾服務器2000」 應該分配特定部分: 「RAM」 「HARD DISK」 「CDROM」

然後,我應該能夠用FK創建10X資產的ServerModel。現在,這些資產中的每一個都應該能夠標記「RAM」部分上次用於此特定資產的時間。

回答

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()) 

首先要注意的是的關係使用「貫穿」模型的servermodel的部分:這種方式爲每個Part實例分配一個ServerModel實例的「parts」屬性創建一個新的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()) 

基本上你可以再補充資產,然後查詢有部分A RAM的所有資產。

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

獲取通過查詢集的第一個(或最後一個)結果的日期,你有你「RAM'部分的最後使用的日期。

+0

這不太對。 'through'模型必須將ForeignKey分配給ManyToMany關係的兩個表。 – 2012-03-05 15:43:43

+0

謝謝。更新以反映這一點。 – marue 2012-03-05 16:04:11

+0

嗨!謝謝,更新以上澄清!我很感激! :] – Zee 2012-03-05 16:21:50