为django模型将生成的字段保存在缓存中。
paper的Python项目详细描述
为django模型将生成的字段保存在缓存中。
用法
您有两个选项:@paper将帮助您创建存储在 django的缓存和@cardboard将在模型中创建一个常规字段并在中更新它 自动数据库。
@纸张
就像@propertydecorator一样,您只需要使用@paperdecorator,它将 将类的方法转换为缓存属性。
classModelA(models.Model):name=models.TextField()@paper(1,[('testpaper.ModelB',lambdai:ModelA.objects.filter(children=i)),])defcount(self):returnModelA.objects\ .filter(pk=self.pk)\ .annotate(count=Coalesce(Sum('children__count'),0))\ .values_list('count',flat=True)[0]classModelB(models.Model):parent=models.ForeignKey('ModelA',related_name='children')count=models.IntegerField()
@paper接受两个参数:
- 方法的版本号,以防更改返回内容的格式。由 例如,假设您返回一个复杂的非规范化数据结构。如果在某个时候你 要在其中添加一些数据,只需增加版本号,它就会使 自动缓存
- 模特/李斯特夫妇的列表。 -模型要么是模型类,要么是'app.model'字符串 -lister接受一个参数,它是更新模型的一个实例(这里是modelb 返回要失效的受影响对象的列表(这里是modela对象的queryset)。
该值将使用django的默认缓存进行缓存。请注意,这需要缓存 在所有web工作者实例中共享,否则无效将没有任何预期的 功效
无效是基于django信号的,因此需要调用save()或delete()。 以便正确工作。不会自动检测批量/SQL操作。
@纸板
使用与@paper非常相似,主要区别在于没有版本控制和 结果将存储在模型本身中,而不是缓存它
classModelA(models.Model):name=models.TextField()@cardboard(models.IntegerField(default=0),[('testpaper.ModelB',lambdai:ModelA.objects.filter(children=i)),])defcount(self):returnModelA.objects\ .filter(pk=self.pk)\ .annotate(count=Coalesce(Sum('children__count'),0))\ .values_list('count',flat=True)[0]classModelB(models.Model):parent=models.ForeignKey('ModelA',related_name='children')count=models.IntegerField()
@cardboard有两个参数:
- 将用于存储结果的字段你必须给它一个合理的默认值, 因为在创建对象时不会进行计算。计算仅由 dependencies函数。
- 依赖项列表,就像在@paper中一样。
对于这种技术,同样的说法是save()/delete()驱动的:批量或sql操作 不会触发重新计算。
许可证
本软件由Activkonnect根据WTFPL的条款授权。