【问题标题】:Python ORMs with attribute constraints such as required / optional?具有属性约束(例如必需/可选)的 Python ORM?
【发布时间】:2015-10-25 00:37:48
【问题描述】:

这是 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
  • SQL 对象
  • 风暴
  • 姜戈
  • 小便

【问题讨论】:

    标签: python django orm sqlalchemy peewee


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用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。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2018-12-02
          • 1970-01-01
          • 2018-05-20
          • 1970-01-01
          • 2013-12-27
          • 2023-04-03
          • 1970-01-01
          • 2017-01-09
          • 1970-01-01
          相关资源
          最近更新 更多