我使用django ORM关注django子查询。当我们获取查询集或执行数据库操作时,我可以选择绕过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)
我获取一个QuerySet,代表所有被称为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会这样做。恕我直言,如果我选择强制使用数据库作为原始查询,那么即使是子查询,也需要使用相同的数据库。为什么数据库路由器必须为此着想?
答案 0 :(得分:0)
这不是严格的SQL意义上的子查询。你在这里实际做的是执行一个查询并使用其结果来查找相关项目。
你可以在查询集上链接过滤器并执行许多其他操作,但是在你对它进行切片或调用.values()之前不会执行它,但是在这里你实际上是在切片
auth_address = b_det[0].#rest of code
所以你有一个具体化的查询,你现在正试图找到相关作者的地址,这需要另一个查询,但你没有使用,所以django可以自由选择使用哪个数据库。您可以使用select_related
克服此问题