Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建Django模型,该模型与不同PostgreSQL模式中的表有许多关系,一个模型只使用非托管表的一部分_Django_Django Models_Django Postgresql - Fatal编程技术网

如何创建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.

我有一个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\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'
不使用表列中的所有字段也是可以的