如何在不同的 PostgreSQL 模式中创建具有 ManyToMany 关系和 tables 的 Django 模型,一个模型仅使用非托管 table 的一部分
How to create Django models with ManyToMany relation with tables in different PostgreSQL schemas, one model using just part of unmanaged table
我有一个运行良好的 Django 应用程序。问题是它需要迁移并带来一些变化。
整个应用程序过去都在 PostgreSQL 架构中。
问题出在以下型号上。
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_list 的现有 table。 Table 在不同的模式命名列表中,它
包含许多列。我只需要其中三个。 Table 也被其他应用程序使用,仅用于阅读。
我试过这样创建路由器:
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_list'
也没有工作。
无论我尝试什么,Django 总是在摄入模式中创建 table authority_list。
而且因为关系是多对多的,Django 创建连接 table 也链接 intake.authority_list 而不是
lists.authority_list.
我找到的唯一解决方案是在架构输入中创建视图,select 我需要的那 3 列来自 lists.authority_list。
但后来我被告知无法使用视图。 Table lists.authority_list 定期(每周一次)更新
以 table 被删除并重新创建的方式。在我看来,这不是一个好的做法,但我无法改变它。
有什么办法吗?
回答我自己的问题:其实很简单。
问题出在生成的迁移上,而不是模型语法上。由于我的应用程序尚未投入生产,因此我可以删除所有迁移和数据库并重新创建它们。这很有帮助,现在它按我预期的那样工作。
您只需要:
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_table = 'lists\".\"authority_list'
这样的语法
并且可以不使用 table 列中的所有字段。
我有一个运行良好的 Django 应用程序。问题是它需要迁移并带来一些变化。
整个应用程序过去都在 PostgreSQL 架构中。
问题出在以下型号上。
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_list 的现有 table。 Table 在不同的模式命名列表中,它 包含许多列。我只需要其中三个。 Table 也被其他应用程序使用,仅用于阅读。
我试过这样创建路由器:
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_list'
也没有工作。
无论我尝试什么,Django 总是在摄入模式中创建 table authority_list。
而且因为关系是多对多的,Django 创建连接 table 也链接 intake.authority_list 而不是
lists.authority_list.
我找到的唯一解决方案是在架构输入中创建视图,select 我需要的那 3 列来自 lists.authority_list。 但后来我被告知无法使用视图。 Table lists.authority_list 定期(每周一次)更新 以 table 被删除并重新创建的方式。在我看来,这不是一个好的做法,但我无法改变它。
有什么办法吗?
回答我自己的问题:其实很简单。
问题出在生成的迁移上,而不是模型语法上。由于我的应用程序尚未投入生产,因此我可以删除所有迁移和数据库并重新创建它们。这很有帮助,现在它按我预期的那样工作。
您只需要:
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_table = 'lists\".\"authority_list'
这样的语法
并且可以不使用 table 列中的所有字段。