Skip to main content

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

项目描述

Django 查询集约束

构建状态 发布状态 执照 Python 版本 Django 版本

通过将 Django 查询集编译为数据库插入/更新触发器,该库使人们能够编写可靠的数据不变量。迁移系统。

动机

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

使用Django Queryset Signals库尝试批准这一点。虽然这个库更接近于一个可靠的解决方案,但它并没有成功,因为仍然可以通过直接访问数据库来破坏数据不变量。

数据库约束触发器将有效地防止所有情况。

安装

pip install django_queryset_constraint

用法

  • django_queryset_constraint应用程序添加到INSTALLED_APPS
# settings.py
INSTALLED_APPS = {
    'django_queryset_constraint',
    ...
}

注意:这应该任何将被检查的应用程序之前完成

  • 添加QuerysetConstraintconstraints要检查的模型的 Meta 类中:
# 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 组合:

姜戈 Python
2.2 3.6、3.7

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django_queryset_constraint-1.0.6.tar.gz (14.3 kB 查看哈希)

已上传 source