Python ORM具有属性约束,例如required / optional?

时间:2015-08-03 01:25:22

标签: python django orm sqlalchemy peewee

这是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是否支持必需与可选属性和验证?如果是这样,怎么样?

  • SQLAlchemy的
  • 的SQLObject
  • 风暴
  • Django的
  • Peewee

3 个答案:

答案 0 :(得分:2)

我也不确定您是否想在非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)])

答案 1 :(得分:1)

使用SQLAlchemy

  • 必填/可选是通过设置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。

答案 2 :(得分:1)

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