我有一个Django项目,我需要在页面之间使用旧数据库和新数据库源。它们都具有相同的表名和字段名,但加载了不同的数据。
现在,这些是已经装载数据的实际模型,因此我不能从头开始设计两个具有唯一名称的模型。
问题是。我可以拥有多个具有相同表名的模型吗?如何在models.py
中区分它们?
然后,如果Django在我的view.py
中使用哪个模型,如果它们具有相同的表名和相同的字段名,我该如何告诉Django? BTW每个视图都将使用一个或其他模型,因此我不需要同时使用这两个模型。
旧数据库:
class Business(models.Model):
name = models.CharField(max_length=50, ...
city = models.ForeignKey('City', ...
state = models.CharField( ...
zipcode = models.CharField(...
新数据库:
class Business(models.Model):
name = models.CharField(max_length=50, ...
city = models.ForeignKey('City', ...
state = models.CharField( ...
zipcode = models.CharField(...
答案 0 :(得分:2)
在讨论之后,我想出了这个想法:
1)将您的DATABASES设置更改为指向两个不同的DB。您可以查看here
2)更改模型定义以包含两个版本并指向同一个表。使用1.7版进行测试时,django会在模型验证中忽略这一点,但非常小心迁移:
class OldBusiness(models.Model):
class Meta:
db_table = 'business_business'
name = models.CharField(max_length=50, ...
city = models.ForeignKey('City', ...
state = models.CharField( ...
zipcode = models.CharField(...
class Business(models.Model):
class Meta:
db_table = 'business_business'
name = models.CharField(max_length=50, ...
city = models.ForeignKey('City', ...
state = models.CharField( ...
zipcode = models.CharField(...
3)覆盖对象管理器以确保为任何查询使用正确的数据库:
class OldManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return super(OldManager, self).get_queryset(*args, **kwargs).using('old')
class OldBusiness(models.Model):
class Meta:
db_table = 'business_business'
objects = OldManager()
name = models.CharField(max_length=50, ...
city = models.ForeignKey('City', ...
state = models.CharField( ...
zipcode = models.CharField(...
对于大多数实际情况, 应该执行此操作,但如果您要更新,则必须考虑其他因素。
作为注释:这假设您将新数据库保留在DATABASES dict中的“default”键中
一个非常好的改进是为OldBusiness模型实现database router
在这种情况下,您甚至可以检查型号名称并返回旧的数据库。很干净,可以用于迁移