Python 具有属性约束(例如必需/可选)的 ORM?

Python ORMs with attribute constraints such as required / optional?

Pony ORM 的功能如下:

class Business(db.Entity):
    name        = Required(str)
    latitude    = Optional(float, py_check=lambda val: -90 <= val <= 90)
    longitude   = Optional(float, py_check=lambda val: -180 <= val <= 180)

我正在尝试确定其他任何工具(SQLAlchemy、SQLObject 等)是否可以执行此操作。特别是那些可以用作框架中的库的。 (所以,我不确定在非 Django 应用程序中使用 Django ORM 需要做多少工作。)

我很难在各种文档中找到此功能,但我确信他们支持它。

所以我的问题是:这些(或其他)ORM 是否支持必需属性和可选属性和验证?如果可以,怎么做?

我也不确定你是否想在非 Django 应用程序中使用 Djano ORM,但郑重声明,这是你使用 Django 内置功能的方式:

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

class Business(models.Model):
    name = models.TextField()
    latitude = models.FloatField(null=True, blank=True,
                                 validators=[MinValueValidator(-90), MaxValueValidator(90)])
    longitude = models.FloatField(null=True, blank=True,
                                  validators=[MinValueValidator(-180), MaxValueValidator(180)])

使用SQLAlchemy

  • Required/Optional 通过设置 nullable = False/True
  • 完成
  • 使用 Simple Validators
  • 完成验证

下面的代码使用Flask,但是纯sqlalchemy代码几乎是一样的:

class Business(db.Model):
    __tablename__ = 'business'
    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String, nullable=False)
    latitude = db.Column(db.Float, nullable=True)
    longitude = db.Column(db.Float, nullable=True)

    @db.validates('latitude')
    def validate_lat(self, key, value):
        assert value is None or (-90 <= value <= 90)
        return value

    @db.validates('longitude')
    def validate_lon(self, key, value):
        assert value is None or (-180 <= value <= 180)
        return value

正如@kevin-christopher-henry 已经指出的那样,将 Django ORM 与非 Django 框架一起使用几乎没有意义,反之亦然:如果使用 Django,则意义重大 更容易坚持使用 Django ORM。

Peewee 不支持将验证器作为 ORM 的一部分,但是您可以使用 Field.null 来指示字段是否需要具有值。