Django使用具有相同表格的多个模型&字段名称?

时间:2015-02-23 14:53:05

标签: python mysql django

我有一个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(...

1 个答案:

答案 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

在这种情况下,您甚至可以检查型号名称并返回旧的数据库。很干净,可以用于迁移