Django模型:通过外键跟随保留对象标识

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.

Dan*_*man 6

有很多可能的解决方案.

也许最简单的方法是自己跟踪父母:

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-idmapperdjango-selectreverse是我所知道的两个.