我注意到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查找,但它是否正常工作?谢谢!
答案 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
从一个表中选择数据。