Django:如何在不重写代码的情况下将现场添加到现有模型
问题描述:
我们的网站列出了当地的城市活动。它是基于Django的,所以有很多与'event'模型相关的代码。到现在为止,我们只在一个城市工作,所有事件都意味着本地化。Django:如何在不重写代码的情况下将现场添加到现有模型
现在我们需要将网站扩展到另一个城市。这意味着“事件”模型会获得一个新的属性“城市”,我们的中间件将基于geoip设置一个全球价值CurrentCity。
我们需要扩展“事件”模型,以便只过滤“城市”属性等于CurrentCity值的记录。在不同的视图和模型中使用'事件'的代码太多,所以我们无法更新每个模块。
是否有任何修补程序可以让我们的'事件'模型知道CurrentCity值?
答
根据你的结构和Django版本的很多,我认为你有2个选项。
南
最好的是安装应用程序“南”。我不知道你是否已经知道它,或者你正在使用它,但我认为它应该是你的第一选择。
如果你不使用它,你应该这样做的步骤:
- 与
pip install South
-
安装与创建第一个迁移:
python manage.py schemamigration YOURAPPNAME --initial
-
您需要伪造此迁移,因为你已经在fullfilled数据库,因此你需要做的:
python manage.py migrate YOURAPPNAME --fake
的新字段添加到模型事件在文件模型。PY
-
生成新的迁移,使南在数据库中创建新的字段:
python manage.py schemamigration YOURAPPNAME --auto
-
最后一步,执行与创建的迁移:
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