Kla*_*ven 2 django django-models
Django的ORM(版本1.2.3)在来回跟踪外键时不保留标识.最好用一个例子来解释:
class Parent(models.Model):
pass
class Child(models.Model):
parent = models.ForeignKey(Parent)
parent = Parents.objects.get(id=1)
for child in parent.child_set.all():
print id(child.parent), "=!", id(parent)
Run Code Online (Sandbox Code Playgroud)
因此,对于每个子节点,即使我们在获取子节点时知道父节点,也会从数据库中重新获取父节点.这对我来说是违反直觉的.
在我的情况下,这也会导致性能问题,因为我在父级别做了一些繁重的操作,我想在对象实例级别缓存.但是,由于这些计算的结果是通过child => parent链接访问的,因此父级别的此缓存是无用的.
关于如何解决这个问题的任何想法?
我已经知道有一个ForeignRelatedObjectsDescriptor和一个ReverseSingleRelatedObjectDescriptor.
有很多可能的解决方案.
也许最简单的方法是自己跟踪父母:
parent = Parents.objects.get(id=1)
for child in parent.child_set.all():
child._parent_cache = parent
Run Code Online (Sandbox Code Playgroud)
_FOO_cache是Django跟踪通过ForeignKey获取的项目的方式,因此如果您使用您已经拥有的父项预先填充该对象,Django将不会在您引用时再次获取它child.parent.
或者,您可以查看尝试解决此问题的第三方库之一 - django-idmapper或django-selectreverse是我所知道的两个.
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |