UserProfile 객체에 JSON 객체가 포함 된 여러 TextField 열이 있습니다. 필자는 JSON을 파이썬 데이터 구조로 직렬화 및 비 직렬화하는 로직을 캡슐화하는 각 열에 대한 setter/getter 속성도 정의했습니다.Django 모델 객체에서 값 비싼 계산을 어떻게 메모합니까?
이 데이터의 특성상 단일 요청 내에서보기 및 템플릿 논리를 통해 여러 번 액세스 할 수 있습니다. deserialization 비용을 절약하기 위해, 나는 read시에 파이썬 데이터 구조를 메모하고, 속성에 대한 직접 작성시 무효화하거나 모델 객체에서 신호를 저장하고 싶습니다.
어디에서 어떻게 메모를 저장합니까? 특정 UserProfile이 쿼리에 의해 인스턴스화 된 방법을 이해하지 못하기 때문에 인스턴스 변수를 사용하는 것이 불안합니다. __init__
을 사용하는 것이 안전합니까? 아니면 각 읽기시에 hasattr()
을 통해 메모 속성의 존재를 확인해야합니까?
여기에 내 현재 구현의 예 :
class UserProfile(Model):
text_json = models.TextField(default=text_defaults)
@property
def text(self):
if not hasattr(self, "text_memo"):
self.text_memo = None
self.text_memo = self.text_memo or simplejson.loads(self.text_json)
return self.text_memo
@text.setter
def text(self, value=None):
self.text_memo = None
self.text_json = simplejson.dumps(value)
잘 알고 있습니다. 감사. –
클래스 메소드의 경우'django.utils.functional.cached_property'를 사용하는 것을 선호합니다. 클래스 메쏘드의 첫 번째 인수가'self'이므로 memoize는 객체를 버리고 난 후에도 객체에 대한 참조와 함수의 결과를 유지합니다. 가비지 컬렉터가 부실 객체를 정리하지 못하게하여 메모리 누수가 발생할 수 있습니다. 'cached_property'는 다니엘의 제안을 데코레이터로 바꾸어줍니다. – Arion
아리온, 이것은 정확히 내가 뭘 찾고 있었는지 :-) – pstadler