django select_for_update和select_related在同一个查询?

时间:2016-03-27 23:13:25

标签: python django postgresql django-queryset

有人知道你是否可以在一个查询中同时执行.select_for_update()和.select_related()语句?如:

employee = get_object_or_404(Employee.objects.select_for_update().
                              select_related(‘company’), pk=3)

它似乎在我的代码中的一个地方正常工作,但第二次使用引发了一个" InternalError:当前事务被中止"进行一系列单元测试。删除.select_related并只留下.select_for_update使错误消失,但我不知道为什么。我想用它们来优化我的代码,但如果被迫选择,我会选择select_for_update。想知道我是否可以同时使用这两种方式。使用postgres和django 1.9。谢谢!

2 个答案:

答案 0 :(得分:2)

在同一查询集上使用select_related时,不能将select_for_update与可以为空的外键一起使用。

这适用于所有情况:

Book.objects.select_related().select_for_update().get(name='Doors of perception')

答案 1 :(得分:0)

自Django 2.0起,即使在可空关系上,您可以select_for_update一起使用select_related-using new parameter of=...

使用他们在文档中的Person示例,您可以

Person.objects.select_related('hometown').select_for_update(of=('self',))

仅锁定Person对象