I recently had a need for a LazyObject which was callable. The __call__ meta method isn't forwarded to _wrapped, so it's an error to call, even if the underlying _wrapped does support it.
In my case, was trying to do the following: User = SimpleLazyObject(lambda: get_user_model()) User()... I patched LazyObject to make it happy: def _a_call_(self, *args, **kwargs): if self._wrapped is empty: self._setup() return self._wrapped(*args, **kwargs) LazyObject.__call__ = _a_call_.__get__(User) Unfortunately, I then ran into a related problem -- by making LazyObject callable, anyone passing a lazy user, e.g. request.user, to the ORM would fall into the callable(value) branch: https://github.com/django/django/blob/b77f26313cddbfde20dcf2661e9bd35458c2d1bd/django/db/models/sql/query.py#L1043 That then caused a new User to be constructed rather than using the request.user.pk. I see that callable criteria are deprecated there, but was wondering how people would feel about adding a branch before that: if ... elif isinstance(value, LazyObject): pass elif callable(value): ... That would allow request.user to still be used (as it no doubt widely is) even after LazyObject grows a callable (if its underlying object has one). -- You received this message because you are subscribed to the Google Groups "Django developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To post to this group, send email to django-developers@googlegroups.com. Visit this group at http://groups.google.com/group/django-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAM0i3f7hshHzW9XsuRkJaT%2BaVEMetTKkzD7nUiDqMF9%2BzAR4rw%40mail.gmail.com. For more options, visit https://groups.google.com/groups/opt_out.