2009-06-26 25 views
2

我已經在我的模型下面的類文件顯示行從另一個表計數在Django

class HardwareNode(models.Model): 
    ip_address = models.CharField(max_length=15) 
    port = models.IntegerField() 
    location = models.CharField(max_length=50) 
    hostname = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.hostname 

class Subscription(models.Model): 
    customer = models.ForeignKey(Customer) 
    package = models.ForeignKey(Package) 
    location = models.ForeignKey(HardwareNode) 
    renewal_date = models.DateTimeField('renewal date') 

    def __unicode__(self): 
     x = '%s %s' % (self.customer.hostname, str(self.package)) 
     return x 

我願意做訂閱的一個特定HardwareNode數的計數,並顯示在管理員硬件節點類的部分例如10個訂閱託管在節點2

我還在學習Django和我不知道在那裏我會做到這一點。可以/我應該在models.py還是HTML中執行?

感謝,

-seth

回答

6

當創建一個foreign_key,其他模型獲取返回的第一個模型的所有實例的管理者(見navigating backward) 在你的情況下,將它命名爲「subscription_set」。

此外,Django的允許在模型的虛擬域,叫做「模型方法」,即沒有連接到數據庫中的數據,但被實現爲模型的方法(見model methods

把所有在一起,你能有這樣的事情:

class HardwareNode(models.Model): 
    ip_address = models.CharField(max_length=15) 
    port = models.IntegerField() 
    location = models.CharField(max_length=50) 
    hostname = models.CharField(max_length=30) 
    subscription_count = lambda(self: self.subscription_set.count()) 

然後,包括字段列表SUBSCRIPTION_COUNT在管理面板中列出。

注:像往常一樣,我沒有檢查這個代碼,它甚至可能無法運行,因爲它是,但它應該就如何對你的問題的工作有所瞭解;此外,我用一個lambda只是爲了簡潔,但通常我認爲這將是一個更好的選擇(風格,可維護性等)使用命名的。

+0

這將行不通,因爲self.subscription_set是一種方法和不具有的長度。另外,您不應該在查詢集上使用len(),因爲這會強制評估。改用self.subscription_set.count()。 – 2009-06-26 12:33:00

0

在你HardwareNode類保持訂閱列表,然後創建一個返回列表的長度的函數或只是通過HTML訪問變量的長度。這是不是通過所有訂閱的打算和計數HardwareNodes的要好一些,特別是因爲Django的可以很容易地在數據庫中有一個雙向的關係。

相關問題