如何创建Django模型,该模型与不同PostgreSQL模式中的表有许多关系,一个模型只使用非托管表的一部分
我有一个Django应用程序,它工作得很好。问题是它需要迁移,这会带来一些变化 整个应用程序以前都在PostgreSQL模式中。如何创建Django模型,该模型与不同PostgreSQL模式中的表有许多关系,一个模型只使用非托管表的一部分,django,django-models,django-postgresql,Django,Django Models,Django Postgresql,我有一个Django应用程序,它工作得很好。问题是它需要迁移,这会带来一些变化 整个应用程序以前都在PostgreSQL模式中。 问题在于以下模型 class Authority(models.Model): id = models.IntegerField(primary_key=True) code = models.IntegerField() name = models.CharField(max_length=255) class Doc(behaviors.
问题在于以下模型
class Authority(models.Model):
id = models.IntegerField(primary_key=True)
code = models.IntegerField()
name = models.CharField(max_length=255)
class Doc(behaviors.Timestampable):
id = models.IntegerField(primary_key=True)
authorities = models.ManyToManyField(Authority, related_name="docs", )
我需要权限模型来使用名为Authority\u list的现有表。表位于不同的模式命名列表中,并且
包含许多列。我只需要三个。表也被其他应用程序使用,仅用于阅读
我试着像这样创建路由器:
ROUTED_MODELS = [models.Authority]
class DefaultRouter:
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS:
return 'lists'
return None
def db_for_write(self, model, **hints):
if model == models.Authority:
raise Exception("This model is read only!")
return None
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=intake,lists,public'
},
'NAME': 'dmx',
'USER': 'postgres',
'HOST': 'localhost',
},
'lists': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=lists,intake,public'
},
'NAME': 'dmx',
'USER': 'postgres',
'HOST': 'localhost',
},
DATABASE_ROUTERS = ('dmx.db_routers.DefaultRouter',)
变更权限模型
class Authority(models.Model):
class Meta:
managed = False
db_table = "authority_list"
它没有像我想要的那样工作,所以我在某个地方找到了这个语法'lists\“\”authority\u list'
,它也不起作用
无论我尝试什么,Django总是在接收模式中创建表权限列表。由于关系是多对多的,Django创建了连接表,该表也链接了admination.authority\u列表,而不是 lists.authority\u列表 我找到的唯一解决方案是在模式摄取中创建视图,从lists.authority\u列表中选择我需要的3列。 但后来我被告知视图不能使用。表列表。权限列表定期(每周一次)更新 在某种程度上,表被删除并再次创建。在我看来,这不是一个好的做法,但我不能改变它
有什么方法可以做到吗?回答我自己的问题:其实很简单 问题在于生成的迁移,而不是模型语法。由于我的应用程序尚未投入生产,我可以删除所有迁移和数据库并重新创建它们。这很有帮助,现在它就像我预期的那样工作 你唯一需要的是:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=intake,lists,public'
},
'NAME': 'dmx',
'USER': 'postgres',
'HOST': 'localhost',
},
和模型
class Authority(models.Model):
id = models.IntegerField(primary_key=True)
code = models.IntegerField()
name = models.CharField(max_length=255)
class Meta:
managed = False
db_table = "authority_list"
你不需要写你的路由器。只需将模式(在我的例子中是列表)添加到数据库选项中。您不需要使用(可能已弃用?)语法,如db\u table='lists\“\”authority\u list'
不使用表列中的所有字段也是可以的