用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广播接收器未检测到按键事件   java不为特定列更改创建修订   java采用了更实用的方法   java桌面窗格HTML呈现   java处理internet连接丢失   java在调整JFrame的大小时,如何防止JTable的列调整大小?   如何用Java中的“Scanner.hasNext”完成程序   具有模块名称的java停止IntelliJ项目工具窗口?   执行已编译的Rails-Warbler JAR文件时发生java加载错误   java Spring数据redis存储库不支持集合查询?   每个客户端的java队列请求   获取Java中的JSON嵌套数组元素   java GWT,Vaadin ConcurrentModificationException   firebase存储中的java在保存照片之前,我需要发送两次照片   JavaSpringEleaf如何在容器外使用变量