我们的网站列出了当地的城市活动。这是基于Django的,所以有很多与“事件”相关的代码。模型。到目前为止,我们只在一个城市工作,因此所有事件都意味着本地化。
现在我们需要将网站扩展到另一个城市。这意味着'事件' model获取一个新的属性' city',我们的中间件将根据geoip设置一个全局值CurrentCity。
我们需要扩展'事件'模型,所以它只过滤记录城市' attribute等于CurrentCity值。不同的视图和模型中的代码太多,无法使用'事件'所以我们无法更新每个模块。
是否有任何一个地方可以修补我们的活动'模型意识到CurrentCity值?
答案 0 :(得分:0)
根据您的结构和Django版本的不同,我认为您有两个选择。
最好的方法是安装应用程序" South"。我不知道你是否已经知道它或者你正在使用它,但我认为它应该是你的第一选择。
如果您不使用它,则应执行以下步骤:
pip install South
使用以下命令创建第一次迁移:
python manage.py schemamigration YOURAPPNAME --initial
您需要伪造此迁移,因为您已经拥有完整的数据库,因此您需要这样做:
python manage.py migrate YOURAPPNAME --fake
将 new 字段添加到文件models.py中的模型事件中
生成新的迁移以使South在数据库中创建新字段:
python manage.py schemamigration YOURAPPNAME --auto
最后一步,执行使用以下创建的迁移:
python manage.py migrate YOURAPPNAME
提示
--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