2016-11-04 41 views
0

我遇到了django子查询的问题。当我获取原始的QuerySet时,我指定了需要使用的数据库。我的直觉是后面的子查询最终使用“默认”数据库而不是父查询使用的。django子查询使用的数据库是否粘滞?

我的模型大约看起来像这样(我有几个): -

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) 

现在我取表示被称为马克像这样所有书籍查询集: -

b_det = Book.objects.using('some_db').filter(book_name = 'Mark') 

再后来某处在代码中,我通过执行类似操作触发子查询: -

if b_det: 
    auth_address = b_det[0].author.author_address 

我的问题是在某些情况下,在我的实时服务器上,任意子查询都会失败,即使该作者的ID有有效数据。我怀疑是子查询没有使用相同的数据库'some_db'。这可能吗?这是否使得需要使用的数据库在子查询中不粘?这只是一个预感,这可能是一个问题,它发生在芹菜工人的背景下,芹菜与django ORM的组合是否有一些缺陷?

我已经通过调用select_related这样来解决这个问题。

b_det = Book.objects.using('some_db').select_related('author').filter(book_name = 'Mark') 

所以现在,为我解决问题的唯一办法就是事先确定所有我需要的数据,并确保最高级别取了所有使用select_related这些内部模型引用。任何想法为什么这样会失败?

我无法在本地重新创建,否则我会调试它。就像我说的那样,它非常随意。

回答

0

好吧,我现在有一个处理。我假设子查询将保持粘贴到原始数据库是错误的。 django所做的一件事就是首先击中配置的数据库路由器。如果仅在这种情况下它不返回任何东西,它将利用原始数据库。

所以,如果配置的数据库路由器返回一些要使用的数据库,那么就会被使用。在我看来这是错误的,我们需要先使用原始数据库,然后检查数据库路由器。