Changeset 7216 for django/trunk/django/contrib/contenttypes/models.py
- Timestamp:
- 03/10/08 18:32:28 (10 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/contenttypes/models.py
r6287 r7216 3 3 from django.utils.encoding import smart_unicode 4 4 5 CONTENT_TYPE_CACHE = {}6 5 class ContentTypeManager(models.Manager): 6 7 # Cache to avoid re-looking up ContentType objects all over the place. 8 # This cache is shared by all the get_for_* methods. 9 _cache = {} 10 7 11 def get_for_model(self, model): 8 12 """ 9 Returns the ContentType object for the given model, creating the 10 ContentType if necessary. 13 Returns the ContentType object for a given model, creating the 14 ContentType if necessary. Lookups are cached so that subsequent lookups 15 for the same model don't hit the database. 11 16 """ 12 17 opts = model._meta 13 18 key = (opts.app_label, opts.object_name.lower()) 14 19 try: 15 ct = CONTENT_TYPE_CACHE[key]20 ct = self.__class__._cache[key] 16 21 except KeyError: 17 # The smart_unicode() is needed around opts.verbose_name_raw because it might 18 # be a django.utils.functional.__proxy__ object. 19 ct, created = self.model._default_manager.get_or_create(app_label=key[0], 20 model=key[1], defaults={'name': smart_unicode(opts.verbose_name_raw)}) 21 CONTENT_TYPE_CACHE[key] = ct 22 # Load or create the ContentType entry. The smart_unicode() is 23 # needed around opts.verbose_name_raw because name_raw might be a 24 # django.utils.functional.__proxy__ object. 25 ct, created = self.get_or_create( 26 app_label = opts.app_label, 27 model = opts.object_name.lower(), 28 defaults = {'name': smart_unicode(opts.verbose_name_raw)}, 29 ) 30 self._add_to_cache(ct) 31 22 32 return ct 23 33 34 def get_for_id(self, id): 35 """ 36 Lookup a ContentType by ID. Uses the same shared cache as get_for_model 37 (though ContentTypes are obviously not created on-the-fly by get_by_id). 38 """ 39 try: 40 ct = self.__class__._cache[id] 41 except KeyError: 42 # This could raise a DoesNotExist; that's correct behavior and will 43 # make sure that only correct ctypes get stored in the cache dict. 44 ct = self.get(pk=id) 45 self._add_to_cache(ct) 46 return ct 47 24 48 def clear_cache(self): 25 49 """ … … 29 53 this gets called). 30 54 """ 31 global CONTENT_TYPE_CACHE 32 CONTENT_TYPE_CACHE = {} 55 self.__class__._cache.clear() 56 57 def _add_to_cache(self, ct): 58 """Insert a ContentType into the cache.""" 59 model = ct.model_class() 60 key = (model._meta.app_label, model._meta.object_name.lower()) 61 self.__class__._cache[key] = ct 62 self.__class__._cache[ct.id] = ct 33 63 34 64 class ContentType(models.Model): … … 37 67 model = models.CharField(_('python model class name'), max_length=100) 38 68 objects = ContentTypeManager() 69 39 70 class Meta: 40 71 verbose_name = _('content type')
