我有一个 Django (1.4.2) 数据模型,如下所示:
class CoreData(models.Model):
cdid = models.AutoField(primary_key=True,editable=False)
atr1 = # whatever
atr2 = # whatever
class EnvironData(models.Model):
cdid = models.ForeignKey(CoreData)
# etc
class TransactionData(models.Model):
edid = models.ForeignKey(EnvironData)
# etc
我需要一个原子事务,在其中更新etc
事务数据:
tdo = TransactionData.objects.select_for_update().get(etc=criteria)
# process transaction
# modify tdo object
tdo.save()
到目前为止,一切都很好。但是,在 的过程中process transaction
,我需要检查CoreData.atr1
和CoreData.atr2
。
如果我通过这些访问,tdo.edid.cdid.atr{1,2}
那么我的理解是我会有一个额外的读取数据库查询,因为 Django 会获取丢失的数据。(老实说,我不能 100% 确定它只是一个;也可能是两个——甚至是六个,但我对此表示怀疑。)
另一方面,如果我结合select_related()
使用,select_for_update()
我不仅会锁定不需要(也不应该)锁定的数据,还会为tdo.save()
.
第三种方法可能是通过独立查询(与 无关tdo
)获取数据,如果使用该查询,则可以保证是单个数据库查询select_related()
。另外,它可以使用values()
.
我认为最后一种方法是最有效的,也是因为查询可以从我已经拥有 as的EnvironData
对象开始。edid
tdo.edid_id
我的观点合理吗?有没有更好的方法?
更新:完全可以tdo.edid.cdid.atr{1,2}
独立访问,甚至可以在交易期间更改它们,因为它们彼此独立,并且不需要它们在整个交易过程中保持其价值。(谢谢@Uszy Wieloryba)