用Django编写可靠数据不变量的库。

django-queryset-constraint的Python项目详细描述


Django Queryset约束

Build StatusRelease StatusLicensePython VersionsDjango Versions

这个库允许通过编译Django来编写可靠的数据不变量 查询集到数据库插入/更新触发器,通过。迁移系统。在

动机

Django有一个内置的信号系统,它在各种事件中发出信号,用于 实例模型的创建、更新和删除。然而,这些信号并非如此 emmited用于queryset操作,因此不能用于维护数据 不变量。在

试图通过Django Queryset Signals库来批准这一点。 虽然这个库更接近于一个可靠的解决方案,但它没有成功, 因为访问数据库也有可能打破数据不变量 直接。在

数据库约束触发器将有效地保护所有场景。在

安装

pip install django_queryset_constraint

使用

  • django_queryset_constraint应用程序添加到INSTALLED_APPS
^{pr2}$

注意:这应该在{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的组合:

DjangoPython
2.23.6, 3.7

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

推荐PyPI第三方库


热门话题
java如何将HashMap<String,Object>从一个活动传递到另一个活动   java如何手动加密socket连接的流量?   java正则表达式生成一个不正确的结果   Java方法引用具有泛型参数的方法   java app setBackground()错误:不兼容的类型:int无法转换为Drawable   java是启动Spring引导而不是SpringApplication的其他方法。跑   无法打开java类路径资源[org/quartz/impl/jdbcjobstore/tables_h2.sql],因为它不存在   spring使用Java,如何确定来自tomcat Web服务器的出站服务调用?   java获取多个同名的XML元素JAXB   java使用Ant从同一代码库构建Swing和Android应用程序   JComponent的java重绘方法不起作用   java目标不可访问,标识符“beanName”解析为null   smtp是否有支持esmtp管道的java api?   java如何在Spring中自动连接业务对象   java在Hibernate中没有其他保存实体的方法吗?   针对两个客户机的SpringJavaWeb应用程序项目开发   使用split的java标记化输入