混合以缓存、强制和/或使用非原子model.objects.get_或_create()调用。
django-getorcreateplus的Python项目详细描述
django GETORCCRATEPPLUS是一组QueYSET COMIN,用于创建自定义QueSET集,可以:
- 缓存get_或_create()或update_或_create()的结果
- 在执行get()调用时,始终使用get_或_create()
- 允许非原子get_或_create()以避免嵌套的事务点
快速启动
# models.pyfromdjango.dbimportmodelsfromdjango.core.cacheimportcachesfromgetorcreateplusimportCachedGetOrCreateMixin,AlwaysGetOrCreateMixin,NonAtomicGetOrCreateMixin# sample for CachedGetOrCreateMixin (see below for changes to be made in settings.py)classCachedQuerySet(CachedGetOrCreateMixin,models.QuerySet):passclassCachedManager(models.manager.BaseManager.from_queryset(CachedQuerySet)):use_for_related_fields=TrueclassCachedImmutableModel(models.Model):foo=models.CharField(max_length=8)bar=models.IntegerField(null=True)objects=CachedManager()obj1,_=CachedImmutableModel.objects.get_or_create(foo='FooBar')# fetches from dbobj2,_=CachedImmutableModel.objects.get_or_create(foo='FooBar')# hits cacheclassCachedMutableObject(models.Model):foo=models.CharField(max_length=8)bar=models.IntegerField(null=True)objects=CachedManager()defsave(self,**kwargs):cache=caches[self._meta.model_name]cache.delete(self.pk)returnsuper(CachedMutableObject,self).save(**kwargs)obj1,_=CachedMutableModel.objects.get_or_create(foo='FooBar')# fetches from dbobj1.bar=1obj1.save()# invalidate object cacheobj2,_=CachedMutableModel.objects.get_or_create(foo='FooBar')# fetches from dbobj3,_=CachedMutableModel.objects.get_or_create(foo='FooBar')# hits cache# sample for NonAtomicGetOrCreateMixinclassNonAtomicQuerySet(NonAtomicGetOrCreateMixin,models.QuerySet):passclassNonAtomicManager(models.manager.BaseManager.from_queryset(NonAtomicQuerySet)):use_for_related_fields=TrueclassParentQuerySet(NonAtomicQuerySet):defcreate(self,**kwargs):children=kwargs.pop('children',[])parent=super(ParentQuerySet,self).create(**kwargs)forchildinchildren:parent.children.get_or_create(**child)returnparentclassParentManager(models.manager.BaseManager.from_queryset(ParentQuerySet)):use_for_related_fields=TrueclassParentModel(models.Model):foo=models.CharField(max_length=8)objects=ParentManager()classChildModel(models.Model):parent=models.ForeignKey(Parent,related_name='children')bar=models.CharField(max_length=8)objects=NonAtomicManager()fromdjango.dbimporttransactionwithtransaction.atomic():parent,_=ParentModel.objects.get_or_create(foo='Foo',defaults={children:[{bar:'Bar'},{bar:'Baz'}]})# samples for combining mixins CachedGetOrCreateMixin, AlwaysGetOrCreateMixin, NonAtomicGetOrCreateMixinclassNonAtomicAlwaysQuerySet(NonAtomicGetOrCreateMixin,AlwaysGetOrCreateMixin,models.QuerySet):passclassAlwaysCachedQuerySet(AlwaysGetOrCreateMixin,CachedGetOrCreateMixin,models.QuerySet):passclassPlusQuerySet(CachedGetOrCreateMixin,AlwaysGetOrCreateMixin,NonAtomicGetOrCreateMixin,models.QuerySet):pass< > > Cache EdgReCurraseMIXIN < /CITE >使用Django缓存。密钥被缓存到 默认值缓存,使用别名缓存对象 模型.
注意:如果在不同的应用程序中使用相同名称的模型 CachedGetOrCreateMixin,这会失败的。
# settings.py# assuming use of django-connection-url (shameless self-plug)importconnection_urlCACHES={'default':connection_url.config('locmem:///'),'cachedimmutablemodel':connection_url.config('REDIS_URL'),'cachedmutablemodel':connection_url.config('MEMCACHED_URL'),}