用于指定数据库的Django queryset“using()”方法对related_name查询不起作用

时间:2016-08-26 18:39:57

标签: python django

我注意到Django中有些奇怪的东西,我无法弄明白。假设我有一个Django应用程序(我使用1.7),有两个模型,如:

class Bookstore(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    title = models.CharField(max_length=100)
    store = models.ForeignKey(Bookstore, on_delete=models.PROTECT, related_name='books')

然后假设我有两个存储数据的数据库,可能是主副本设置 - 假设主设备在我的设置文件中表示为default,副本为replica。如果我执行以下查询,则会出现例外情况

  

当前数据库路由器阻止了这种关系

store = Bookstore.objects.using('default').get(id=1)
first_book = store.books.using('replica').all().order_by('id')[0]

但是,以下应该是相同的查询,可以正常工作:

store = Bookstore.objects.using('default').get(id=1)
first_book = Book.objects.using('replica').filter(store=store).order_by('id')[0]

这里发生了什么?反正有没有像第一个例子那样使用related_name查找,但它是否正常工作?谢谢!

1 个答案:

答案 0 :(得分:0)

查看第一个示例中的SQL(没有using()):

SELECT "book"."id", "book"."title", "book"."store_id"
FROM "book" JOIN "bookstore" ON "book"."store_id" = "bookstore"."id"
WHERE "bookstore"."id" = 1
ORDER BY "book"."id"
LIMIT 1

你看到了问题吗?您无法在两个数据库上执行SELECT

从第二个例子看SQL:

SELECT "book"."id", "book"."title", "book"."store_id"
FROM "book"
WHERE "book"."store_id" = 1
ORDER BY "book"."id"
LIMIT 1

从一个表中选择数据。