2015-02-06 41 views
1

我們的網站列出了當地的城市活動。它是基於Django的,所以有很多與'event'模型相關的代碼。到現在爲止,我們只在一個城市工作,所有事件都意味着本地化。Django:如何在不重寫代碼的情況下將現場添加到現有模型

現在我們需要將網站擴展到另一個城市。這意味着「事件」模型會獲得一個新的屬性「城市」,我們的中間件將基於geoip設置一個全球價值CurrentCity。

我們需要擴展「事件」模型,以便只過濾「城市」屬性等於CurrentCity值的記錄。在不同的視圖和模型中使用'事件'的代碼太多,所以我們無法更新每個模塊。

是否有任何修補程序可以讓我們的'事件'模型知道CurrentCity值?

回答

0

根據你的結構和Django版本的很多,我認爲你有2個選項。

最好的是安裝應用程序「南」。我不知道你是否已經知道它,或者你正在使用它,但我認爲它應該是你的第一選擇。

如果你不使用它,你應該這樣做的步驟:

  1. pip install South
  2. 安裝與創建第一個遷移:

    • python manage.py schemamigration YOURAPPNAME --initial
  3. 您需要僞造此遷移,因爲你已經在fullfilled數據庫,因此你需要做的:

    • python manage.py migrate YOURAPPNAME --fake
  4. 字段添加到模型事件在文件模型。PY

  5. 生成新的遷移,使南在數據庫中創建新的字段:

    • python manage.py schemamigration YOURAPPNAME --auto
  6. 最後一步,執行與創建的遷移:

    • python manage.py migrate YOURAPPNAME

提示

  • --initial對於其餘
  • 最初的遷移是僞造的,因爲你已經擁有的表在數據庫中,如果您嘗試不假遷移第一個遷移--auto它將返回錯誤「表已經存在」

創新型城市

另一種選擇,如果你不能改變你的實際模型,或者也許,如果它是太亂了,另一個選擇是生成外耳炎模範城市是這樣的:

class City(models.Model): 
    event_foreign = models.ForeignKey(Event) 
    event_many = models.ManyToManyField(Event, blank=True, null=True) 
    name = models.CharField.... 
    postal_code = models.CharField.... 
    # etc... 

我不知道是至極最適合你的外鍵或ManyToMany取決於城市是否可以有超過1個事件或不是,這是你的選擇。

當你有這樣的模型時,你可以從這個城市模型訪問該事件(因爲ForeignKey或ManyToMany),但是這種關係也可以在另一個方向上進行,如果你有一個事件,你可以得到城市/與之相關的城市,我要告訴兩個例子:使用使用多對多

外鍵

city = City.objects.get(id=1) 
city.event # Returns event 

event = Event.objects.get(id=1) 
event.city # Returns city 

例2

city = City.objects.get(id=1) city.event.all() # Returns a list of events event = Event.objects.get(id=1) event.city_set.all() # Returns a list of cities 
相關問題