Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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
Python 如何使用Django跨模式查询?_Python_Django_Postgresql_Schema - Fatal编程技术网

Python 如何使用Django跨模式查询?

Python 如何使用Django跨模式查询?,python,django,postgresql,schema,Python,Django,Postgresql,Schema,我的postgres数据库中有许多模式。我想在我的所有模式中获得一个查询集(UNIONALL) 我正在使用Django 2.2、python 3.6和postgres 9.7 我尝试定义一个特定的DBManager,如: 类UnionManager(models.Manager): def get_queryset(自我): 返回super().get_queryset().using(“db1”)| super().get_queryset().using(“db2”) 类别帐户(models

我的postgres数据库中有许多模式。我想在我的所有模式中获得一个查询集(UNIONALL)

我正在使用Django 2.2、python 3.6和postgres 9.7

我尝试定义一个特定的DBManager,如:

类UnionManager(models.Manager):
def get_queryset(自我):
返回super().get_queryset().using(“db1”)| super().get_queryset().using(“db2”)
类别帐户(models.Model):
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=True)
label=models.CharField(最大长度=100,null=True)
objects=models.Manager()
工会经理=工会经理()
并使用以下数据库配置:

config={
“默认值”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“名称”:“数据库名称”,
“用户”:bdd_用户,
“密码”:db_pwd,
“端口”:bdd_端口,
“主机”:主机/写入程序,
},
“db1”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“选项”:{
'options':'-c search_path=db1,扩展'
},
“名称”:“数据库名称”,
“用户”:bdd_用户,
“密码”:db_pwd,
“端口”:bdd_端口,
“主机”:主机/写入程序,
},
“db2”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“选项”:{
'options':'-c search_path=db2,extensions'
},
“名称”:“数据库名称”,
“用户”:bdd_用户,
“密码”:db_pwd,
“端口”:bdd_端口,
“主机”:主机/写入程序,
}
}
queryset仅从UnionManager类(此处为“db1”)中的第一个架构(
Account.union\u manager.all()
)返回对象 有什么建议吗?

我找到了一个解决方案(未完全实施):

重新定义查询集:

def调用包装器(fn):
def包装器(自身、*args、**kwargs):
返回CustomQueryset(QuerySet=[getattr(qs,fn.\u name\uuuuuuuuuuuuuuuuuuuuuuuuuuuz)(对于self.QuerySet中的qs,**kwargs)))
返回包装器
类CustomQueryset(QuerySet):
def u u init u u;(self,querysets,model=None,query=None,using=None,hints=None):
self.querysets=querysets
super().\uuuu init\uuuuuu(模型、查询、使用、提示)
def\uuuu deepcopy\uuuuu(自我,备忘录):
引发未实现的错误(“未实现的深度复制”)
定义获取状态(自身):
raise NOTEImplementedError(“\uuuu getstate\uuuuu未实现”)
定义设置状态(自身、状态):
raise NOTEImplementedError(“\uuuu getstate\uuuuu未实现”)
定义(自我):
返回链(*[self.querysets中的qs对应qs])
定义报告(自我):
返回“\n”.join([str(qs)表示self.querysets中的qs])
定义(自我):
返回和([self.querysets中q的len(qs)])
定义(自我):
引发未实现错误(“未实现”)
@呼叫包装器
def过滤器(自身、*args、**kwargs):
通过
def order_by(自身,*字段名称):
raise VALUE ERROR('order\U by不支持CustomQueryset')
@呼叫包装器
def排除(自身、*args、**kwargs):
通过
@呼叫包装器
def distinct(自身,*字段名称):
通过
def计数(自身):
返回和([qs.count()用于self.querysets中的qs])
@呼叫包装器
def select_相关(自身,*字段):
通过
@呼叫包装器
def无(自身):
通过
@呼叫包装器
定义值列表(self,*字段,flat=False,named=False):
通过
@呼叫包装器
def注释(self、*args、**kwargs):
通过
@呼叫包装器
def raw(self、raw_查询、params=None、translations=None、using=None):
通过
@呼叫包装器
def值(自身、*字段、**表达式):
通过
def union(自身,*其他,全部=假):
查询集=[]
对于其他项目中的o_q:
如果len(o_qs.querysets)!=len(自我查询集):
提升值错误('不兼容的CustomQueryset')
querysets+=[qs.union(o)代表qs,o在zip中(self.querysets,o_qs.querysets)]
返回CustomQueryset(querysets=querysets)
def聚合(自身、*args、**kwargs):
计数器=集合。计数器()
#如果函数为Count或Sum,则按键计算的值之和
如果t的所有([isinstance(t,(Count,Sum)),单位为kwargs.values()):
对于[qs.aggregate(*args,**kwargs)中的d,对于self.querysets中的qs]:
计数器更新(d)
返回指令(计数器)
其他:
raise TypeError('CustomQueryset'中仅计数和方法')
我修改了工会经理:

类UnionManager(models.Manager):
def get_queryset(自我):
返回自定义查询集(
queryset=[super().get_queryset().using('db1'),super().get_queryset().using('db2')],
model=self.model,
)

现在
Account.union\u manager.all()
从我的2个模式返回对象

欢迎来到Stackoverflow。请提供更多不起作用的细节。谢谢。我用以下内容编辑了我的文章:queryset只返回UnionManager类中第一个模式的对象(这里是“db1”)