2013-07-30 38 views
0

我試圖創建一套模型來跟蹤音頻設備中的信號流。例如,爲了正確模擬混音器,我需要跟蹤幾個相同的輸入和輸出。例如:是否可以枚舉模型的相同實例?

class signal(models.Model): 
    # e.g., 1/4" mono cable 
    name = models.CharField(max_Length=100) 
    def __unicode__(self): 
     return self.name 

class component_type(models.Model): 
    # e.g., mixer 
    name = models.CharField(max_length=250) 
    def __unicode__(self): 
     return self.name 

class input(models.Model): 
    # e.g., a single channel on a mixer 
    type = models.ForeignKey("signal") 
    component_type = models.ForeignKey("component_type") 
    def __unicode__(self): 
     return "%s - %s" % (self.component_type.name, self.type.name) 

我可以添加一些調音臺的1/4" 單聲道插孔的不同實例的,那也沒問題,我想什麼做的是自動列舉出來,讓我可以跟蹤每個單獨的通道,例如,我希望在混音器上將1/4「單聲道輸入的第一個實例表示爲」混音器 - 1/4「單聲道1',並將第二個實例是'混音器 - 1/4「2',而不是讓它們都被命名爲'混音器 - 1/4」單聲道。

我想這將需要額外的領域和劫持保存方法,但我不太清楚如何去了解它謝謝!

回答

1

像這樣的東西可能是一個良好的開端:

from django.db.models import F 

class Input(models.Model): 
    type = models.ForeignKey("signal") 
    component_type = models.ForeignKey("component_type") 
    number = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
    if not self.pk: 
     self.number = Input.objects.filter(component_type_id=self.component_type_id, type=self.type_id).count() + 1 
    super(Input, self).save(*args, **kwargs) 

    def delete(self, *args, **kwargs): 
    Input.objects.filter(component_type_id=self.component_type_id, type=self.type_id, number__gt=self.number).update(number=F('number')-1) 
    super(Input, self).delete(*args, **kwargs) 

    def __unicode__(self): 
     return "%s - %s" % (self.component_type, self.type, self.number) 

我們覆蓋delete方法來確保當輸入被刪除,具有較高的號碼全部輸入得到一個新的正確的號碼

的一些注意事項:

1)如果不作爲就是工作,請不要拍,代碼草圖

2)我把資本型號名稱的自由,這是一個標準的做法,你也可以採用

3)在delete方法中,我使用update方法一次更新適當的輸入,而不會產生數據庫開銷(一個查詢)。如果這不起作用,你仍然應該朝這個方向努力

4)提出的unicode方法沒有明確使用component_type.name和type.name屬性,但調用每個模型的相應的unicode方法(你可能會在未來更改ComponentType的unicode,輸入將顯示新版本)

+0

我想出了保存覆蓋,但刪除覆蓋是輝煌的。非常感謝! 我也很感謝你在模型命名約定中糾正我。我最近停止了這個工作,因爲我們遇到了錯誤的名字,但我不想讓任何未來合作中的任何applecart感到困擾。再次感謝!! –

+0

不客氣!只需再注意一點:當通過管理操作(在輸入的變更列表視圖上)大量刪除對象時,不會調用delete方法。作爲替代方案,您可以嘗試使用post_delete信號,如果這是您的問題。另見https://docs.djangoproject.com/en/dev/ref/signals/#post-delete和https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects for更多信息!希望這有助於 – ppetrid

+0

這非常有幫助,謝謝! –