用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为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证