在其中一个django应用程序中,我们使用两个数据库引擎A和B,它们都是相同的数据库,但具有不同的模式。我们在两个模式中都有一个名为C的表,但是使用db routing它总是指向数据库B.我们从A中的一个模型中形成了一个valuelist查询集,尝试使用过滤条件{{1在表C中传递相同的值但是,尽管有匹配的记录,它总是取空。当我们将valueslist queryset转换为列表并使用过滤条件__in
在表C中使用它时,它可以正常工作。
不工作
__in
工作
data = modelindbA.objects.values_list('somecolumn',flat=True)
info = C.objects.filter(somecolumn__in=data).values_list
我已经读过django docs和其他SO问题,找不到任何相对的东西。我的猜测是,由于两个模型都在不同的数据库模式中,因此上述方法无效。我需要有关如何解决此问题的帮助。
答案 0 :(得分:0)
当您使用带__in
的查询集时,Django将构造一个SQL查询,该查询使用__in
子句的子查询。由于这两个表位于不同的数据库中,因此不会匹配任何行。
相比之下,如果将第一个查询集转换为列表,Django将继续从第一个数据库中获取数据。然后,当您将该数据传递给第二个查询时,点击第二个数据库,它将按预期工作。
有关详细信息,请参阅documentation for the in
field lookup:
您还可以使用查询集来动态评估值列表,而不是提供文字值列表....此查询集将作为subselect语句进行评估:
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
答案 1 :(得分:0)
因为 values_list 方法返回 django.db.models.query.QuerySet ,而不是列表。 当您使用相同的模式时,orm会对其进行优化,并且只能进行一次查询,但是当模式不同时,它会失败。 只需使用list()。
我甚至建议将它用于一个模式,因为它可以降低查询的复杂性并在大表上更好地工作。