Django:如何在不重写代码的情况下将字段添加到现有模型中

时间:2015-02-06 05:38:22

标签: django django-models

我们的网站列出了当地的城市活动。这是基于Django的,所以有很多与“事件”相关的代码。模型。到目前为止,我们只在一个城市工作,因此所有事件都意味着本地化。

现在我们需要将网站扩展到另一个城市。这意味着'事件' model获取一个新的属性' city',我们的中间件将根据geoip设置一个全局值CurrentCity。

我们需要扩展'事件'模型,所以它只过滤记录城市' attribute等于CurrentCity值。不同的视图和模型中的代码太多,无法使用'事件'所以我们无法更新每个模块。

是否有任何一个地方可以修补我们的活动'模型意识到CurrentCity值?

1 个答案:

答案 0 :(得分:0)

根据您的结构和Django版本的不同,我认为您有两个选择。

最好的方法是安装应用程序" South"。我不知道你是否已经知道它或者你正在使用它,但我认为它应该是你的第一选择。

如果您不使用它,则应执行以下步骤:

  1. 使用pip install South
  2. 安装
  3. 使用以下命令创建第一次迁移:

    • python manage.py schemamigration YOURAPPNAME --initial
  4. 您需要伪造此迁移,因为您已经拥有完整的数据库,因此您需要这样做:

    • python manage.py migrate YOURAPPNAME --fake
  5. new 字段添加到文件models.py中的模型事件中

  6. 生成新的迁移以使South在数据库中创建新字段:

    • python manage.py schemamigration YOURAPPNAME --auto
  7. 最后一步,执行使用以下创建的迁移:

    • python manage.py migrate YOURAPPNAME
  8. 提示

    • --initial用于第一次迁移--auto,其余为
    • 初始迁移是伪造的,因为您的数据库中已经有表,如果您尝试迁移而没有伪造它将返回错误"表已经存在"

    新模范城市

    另一种选择,如果你无法修改你的实际模型,或者如果它太乱了,另一个选择是生成这样的externa模型城:

    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,取决于一个城市可以有多于一个事件或不是,这是你的选择。

    当你有这样的模型时,你可以从这个城市模型访问事件(因为ForeignKEy或ManyToMany),但这种关系也在另一个方向,如果你有一个事件你可以得到城市/城市与之相关的我将展示两个例子:

    示例1使用外键

    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