gpt4 book ai didi

python - Django 使用具有相同表和字段名称的多个模型?

转载 作者:行者123 更新时间:2023-11-29 07:42:24 27 4
gpt4 key购买 nike

我有一个 Django 项目,需要在页面之间使用数据库和数据库源。它们都有相同的表名和字段名,但加载的数据不同。

现在,这些是已经加载数据的实际模型,因此我不能从头开始设计两个具有唯一名称的模型。

问题是。我可以有多个具有相同表名的模型吗?如何在我的 models.py 中区分它们?

那么,如果它们具有相同的表名和相同的字段名,我如何在我的 view.py 中告诉 Django 使用哪个模型?顺便说一句,每个 View 都将使用一个或其他模型,所以我不需要同时使用这两个模型。

旧数据库:

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) 更改数据库设置以指向两个不同的数据库。您可以查看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 字典中的“default”键中

一个非常好的改进是实现 database router对于 OldBusiness 模型

在这种情况下,您甚至可以检查模型名称并返回旧数据库。非常干净并且可以与迁移一起使用

关于python - Django 使用具有相同表和字段名称的多个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28676481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com