一对一字段的反向select_related不起作用

3

根据文档,当关系使用select_related()且为onetoone时,您应该能够捕获反向关系。但是它并没有工作,那么我可能错过了什么?

我的类看起来像这样:

class MainPage(models.Model):
    book = models.OneToOneField(Book, primary_key=True)
    text = models.TextField(blank=True)

我能很好地完成这个任务:

book = Book.objects.get(id=book_id, active=True)
main_page = book.mainpage

但是这样做并不会减少数据库调用:
book = Book.objects.select_related('mainpage').get(id=book_id, active=True)
main_page = book.mainpage

嘿,请对答案留下反馈(即点赞、踩或评论)。这将有助于我们更好地回答/撰写文章:http://blog.codinghorror.com/how-to-write-without-writing/ - Pratyush
根据 https://code.djangoproject.com/ticket/7270 的说法,这应该是可行的,但截至 Django 1.9,我仍然无法使 select_related 在一对一反向关系上工作。 - Symmetric
1个回答

1
我猜你想只执行一个SQL查询(使用一对一连接)。这可能适用于此情况:
book = Book.objects.get(mainpage__book_id=book_id, active=True)

编辑:

你提出的查询方式无法生效,因为select_related仅对查询集有效,而.get返回的是一个实例对象。因此,这样做应该可以:

book = Book.objects.select_related('mainpage').filter(id=book_id, active=True)[0]
main_page = book.mainpage

2
实际上,您可以将其与get一起使用;只是get需要是ORM调用中的最后一部分:book = Book.objects.select_related('mainpage').get(id=book_id, active=True) - foresmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接