2009-12-09 54 views
1

我目前正在開發一個項目來實現Django接口到現有的日曆應用程序。日曆應用程序具有MySQL作爲後端數據庫。Django&定製遺留數據庫

在我們的自定義應用程序中,我們希望修改/擴展現有日曆應用程序使用的其中一個表中的數據,例如,

# Auto-generated by inspectdb - table used by calendar application 
class CalendarEvent(models.Model:) 
    name  = models.CharField(max_length=80) 
    start_time = models.DateTimeField() 
    end_time = models.DateTimeField() 


# Manually created table 
class CustomCalendarEvent(models.Model:) 
    code  = models.CharField(max_length=80) # Mapped from name 
    length  = models.DateTimeField()   # start_time - stop_time 
    .... additional data .... 

我們也希望我們的數據表示與現有的日曆表,即保持同步,當新的條目在日曆應用程序中反映這些會自動傳播到我們的自定義表。

我可以想到一些明顯的方法來做到這一點(例如,由cron或可能MySQL觸發器啓動的同步腳本),但我不覺得這些解決方案特別優雅。

一種可能性是對CustomCalendarEvent使用Custom Manager並覆蓋功能的get_query_set也會觸發同步功能。

這是Django CustomManagers的合法使用嗎?如果不是的話,任何人都可以推薦一種解決這個問題的方法嗎

回答

2

看來你正在試圖用更多的字段擴展CalendarEvent。

首先,我會做此更改CustomCalendarEvent:

code = models.CharField(max_length=80) # Mapped from name

calendar_event = models.ForeignKey(CalendarEvent)

,如果長度剛剛計算START_TIME和END_TIME之間天差我就從CustomCalendarEvent刪除並使其在CalendarEvent中可調用(只是一種執行計算的方法)。

您真的不想在兩個表格之間複製數據 - 這是您在CalendarEvent中有name和在CustomCalendarEvent中有code時會得到的數據。名稱更新必須同步到code,如果您想要執行的所有操作都是使用更多字段擴展CalendarEvent表,那麼沒有理由這樣做。

然後you could override the save() and delete() methods爲CalendarEvent傳播插入/刪除更改。我相信,更新並不重要,因爲CustomCalendarEvent只是CalendarEvent的擴展。

替代方法:在CalendarEvent上使用數據庫插入觸發器將條目傳播到CustomCalendarEvent。我仍然會將CustomCalendarEvent表的外鍵放入CalendarEvent中,而不是重複數據。


編輯:順便說一句,我絕不會用一個custom manager像你所提出的建議,甚至爲一些副作用讀操作修改數據。管理人員正在查詢,而不是修改數據。

+0

感謝您的回覆。開始感覺我在濫用定製管理器的目的。 – Martin 2009-12-10 00:50:43

2

爲什麼你不使用模型繼承? CustomCalendarEvent可以從CalendarEvent繼承並以這種方式添加新字段。

+0

這也是一個非常好的主意。見http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance – cethegeek 2009-12-10 13:26:32

+0

是的......這是一個好主意。我知道Django支持抽象超類的繼承,但沒有意識到我可以擴展現有的類 - 在這種情況下,我不允許修改。 – Martin 2009-12-10 21:15:12