ORM Django (версия 1.2.3) не сохраняет идентификатор при следующих внешних ключах назад и вперед. Это лучше всего объяснить на примере:Модели Django: сохранение идентичности объекта по сравнению с внешним ключом
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)
Таким образом, для каждого ребенка, родитель вновь извлекается из базы данных, даже если мы знаем, что родитель в данный момент мы забираем ребенка. Это противоречит мне.
В моем случае это также приводит к проблемам с производительностью, поскольку я выполняю некоторые тяжелые операции на родительском уровне, которые я хотел бы кэшировать на уровне экземпляра объекта. Однако, поскольку результаты этих вычислений доступны через дочернюю = родительскую ссылку, это кэширование на родительском уровне бесполезно.
Любые идеи о том, как это решить?
Я дошел до того, что выяснил, что есть ForeignRelatedObjectsDescriptor и ReverseSingleRelatedObjectDescriptor.
Спасибо. Я действительно внедрил опцию «отслеживание родителя самостоятельно», прежде чем я заметил ваш ответ. Оба других решения кажутся многообещающими, хотя, поэтому я, вероятно, буду смотреть на них в следующий раз, когда я столкнусь с этим. –
+1 для _Foo_cache. –