用Django编写可靠数据不变量的库。
django-queryset-constraint的Python项目详细描述
Django Queryset约束
这个库允许通过编译Django来编写可靠的数据不变量 查询集到数据库插入/更新触发器,通过。迁移系统。在
动机
Django有一个内置的信号系统,它在各种事件中发出信号,用于 实例模型的创建、更新和删除。然而,这些信号并非如此 emmited用于queryset操作,因此不能用于维护数据 不变量。在
试图通过Django Queryset Signals库来批准这一点。 虽然这个库更接近于一个可靠的解决方案,但它没有成功, 因为访问数据库也有可能打破数据不变量 直接。在
数据库约束触发器将有效地保护所有场景。在
安装
pip install django_queryset_constraint
使用
- 将
django_queryset_constraint
应用程序添加到INSTALLED_APPS
:
注意:这应该在{str 1}$之前完成任何将被检查的应用程序
- 将
QuerysetConstraint
添加到constraints
到要检查的模型的元类:
# models.py
from django.db import models
from django.db.models import Count
from django_queryset_constraint import M, QuerysetConstraint
class Topping(models.Model):
name = models.CharField(max_length=30)
class PizzaTopping(models.Model):
class Meta:
unique_together = ("pizza", "topping")
constraints = [
# A pizza with more than 5 toppings gets soggy
QuerysetConstraint(
name='At most 5 toppings',
queryset=M().objects.values(
'pizza'
).annotate(
num_toppings=Count('topping')
).filter(
num_toppings__gt=5
),
),
# This constraint should be self-explanatory for civilized people
QuerysetConstraint(
name='No pineapple',
queryset=M().objects.filter(
topping__name="Pineapple"
)
),
]
pizza = models.ForeignKey('Pizza', on_delete=models.CASCADE)
topping = models.ForeignKey(Topping, on_delete=models.CASCADE)
class Pizza(models.Model):
name = models.CharField(max_length=30)
toppings = models.ManyToManyField(Topping, through=PizzaTopping)
- 进行迁移:
python manage.py makemigrations
- 运行迁移:
python manage.py migrate
注意:复杂触发器会带来性能开销。
支持矩阵
此应用程序支持以下Django和Python的组合:
Django | Python |
---|---|
2.2 | 3.6, 3.7 |
- 项目
标签: