为什么Django子查询使用的数据库不是粘性的?

为什么Django子查询使用的数据库不是粘性的?,django,django-models,Django,Django Models,我关心使用django ORM的django子查询。当我们获取queryset或执行DB操作时,我可以通过强制使用我想要的特定数据库来绕过django对需要使用的数据库可能做出的所有假设 b_det = Book.objects.using('some_db').filter(book_name = 'Mark') 以上内容忽略了我可能设置的任何数据库路由器,直接转到“some_db” 但如果我的模型大致如此:- class Author(models.Model): author_n

我关心使用django ORM的django子查询。当我们获取queryset或执行DB操作时,我可以通过强制使用我想要的特定数据库来绕过django对需要使用的数据库可能做出的所有假设

b_det = Book.objects.using('some_db').filter(book_name = 'Mark')
以上内容忽略了我可能设置的任何数据库路由器,直接转到“some_db”

但如果我的模型大致如此:-

class Author(models.Model):
    author_name=models.CharField(max_length=255)
    author_address=models.CharField(max_length=255)

class Book(models.Model):
    book_name=models.CharField(max_length=255)
    author=models.ForeignKey(Author, null = True)
我取了一个查询集,表示所有被称为Mark的书,如下所示:-

b_det = Book.objects.using('some_db').filter(book_name = 'Mark')
然后,如果在代码中的某个地方,我通过执行以下操作触发子查询:-

if b_det:
    auth_address = b_det[0].author.author_address
然后,这并没有使用我在早期为主查询指定的原始数据库“some_db”。这会再次通过路由器并拾取(可能)不正确的数据库


django为什么这样做。IMHO,如果我为原始查询选择了强制使用数据库,那么即使对于子查询,也需要使用相同的数据库。为什么数据库路由器必须参与这一切

这不是严格意义上的SQL子查询。这里实际要做的是执行一个查询并使用该查询的结果查找相关项

您可以在queryset上链接筛选器和执行许多其他操作,但只有在对其进行切片或调用.values()后,才会执行该查询集,但这里实际上是在进行切片

auth_address = b_det[0].#rest of code

因此,您有一个具体化的查询,您现在正试图找到相关作者的地址,这需要另一个查询,但您没有使用,因此django可以自由选择使用哪个数据库。您可以通过使用

来克服这个问题,我认为使用select_related根本不是一个选项,因为我事先不知道可能需要执行哪些内部联接。在我的实现中,有6个级别的表使用外键引用。如果我把所有内容都放在select_related中,每次都会变成一个大查询。在你的问题中没有提到六个不同的查询。我回答的是你原来的问题。好的,选择相关的是解决问题的一种方法。