混合以缓存、强制和/或使用非原子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'),}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android Espresso如何检查字符串是否缩写   java jar从cmd写入文件,但不能双击   Grails中的java onetomany映射|我可以在复合键中使用生成的值吗?   java HttpsURLConnection在尝试添加Cookie时已连接   java在Netbeans中不能有同名的包和类   如何在格式化字段自动更改无效输入(Swing)Java时触发事件   用户输入后java JTextArea未更新   java试图用新字符替换字符串中的特定字符   java类加载器在Linux上显示错误路径   java mySQL远程数据库未连接   java如果接口需要MyObject对象,如何返回错误对象?   java无法解析在MainActivity之外调用安卓类时的符号   java如何将应用程序文件正确添加到appium所需的功能?   Java中浮点数组的数据对齐算法