django的一个小程序包,用于根据模型定义和queryset轻松创建临时表
django-storedqueries的Python项目详细描述
Author: | Keryn Knight |
---|---|
Version: | 0.1.4 |
一个小型的Django包,用于简化数据库临时表的创建。
它不需要在您的INSTALLED_APPS
用法
定义一个基本正常的django模型,如下所示:
from django.db import models class MyCoolModel(models.Model): value = models.PositiveIntegerField(primary_key=True) class Meta: abstract = True managed = False
请特别注意Meta属性。否则它会抱怨的。
提供临时表的定义:
from storedqueries import TemporaryTable class MyTemporaryTable(TemporaryTable): model = MyCoolModel queryset = Somedata.objects.order_by('?').annotate(value=models.F('key_name')).values_list('value').iterator()
使用临时表:
from django.http import JsonResponse def myview(request, *args, **kwargs): with MyTemporaryTable() as TemporaryModel: keys = TemporaryModel.objects.all() data = tuple(Somedata.objects.filter(key_name__in=keys)) return JsonResponse({'values': data})
使用with my_cls() as thing:语法将创建一个唯一命名的 使用queryset连接和数据填充的临时表, 当with作用域关闭时,将删除临时表。这个 TemporaryModel变量将是MyCoolModel的子类 临时表的唯一名称。
如果有无法在模块范围内定义的查询,可以执行以下操作:
class MyTemporaryTable(TemporaryTable): model = MyCoolModel def source_queryset(self): return Somedata.objects.filter(created__lte=timezone.now()).annotate(value=models.F('key_name')).values_list('value').iterator()
如果仍然无法获得正确的查询,因为它具有依赖项 在request.useretc之类的东西上,您可以做到:
def myview(request, *args, **kwargs): qs = Somedata.objects.filter(user=request.user.pk) with MyTemporaryTable(queryset=qs) as TemporaryModel: raise NotImplementedError("Dynamic queryset binding")
甚至可能:
def myview(request, *args, **kwargs): qs = Somedata.objects.filter(user=request.user.pk) with TemporaryTable(model=MyCoolModel, queryset=qs) as TemporaryModel: raise NotImplementedError("Dynamic model AND queryset binding")
许可证
是FreeBSD。在存储库的根目录和任何存档中都应该有一个LICENSE文件。
版权所有(c)2019,Keryn Knight 保留所有权利。
在满足以下条件的情况下,允许以源代码和二进制格式重新分发和使用(无论是否修改):
- 源代码的重新发布必须保留上述版权声明、此条件列表和以下免责声明。
- 以二进制形式重新分发必须在分发时提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
此软件由著作权人和出资人提供,如“是”,任何明示或默示保证,包括但不限于,适销性和适合特定目的的默示保证。在任何情况下,版权持有人或贡献者均不对任何直接、间接、附带、特殊、惩戒性或后果性损害(包括但不限于替代货物或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论其原因如何,也不论其责任理论是否在合同中,严格责任,或因使用本软件而产生的侵权行为(包括疏忽或其他),即使被告知此类损害的可能性。
Django StoredQueries的更改历史记录
0.1.4
- 更改了TemporaryTableEditor的open和close方法,以避免将游标用作上下文管理器以获得更高的兼容性(即:我有一个旧的内部项目,这可能有用)
0.1.3
- 如果在delaresForeignKeyetc中传递的临时模型没有为每个模型设置related_name="+"etc,则在运行时引发异常。
- 添加mysql的功能来检测它是否可以使用MEMORY引擎。
0.1.2
- 初始版本