2015-02-06 71 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 
相关问题