Python 如何确保属性具有特定的值?

Python 如何确保属性具有特定的值?,python,sqlalchemy,constraints,Python,Sqlalchemy,Constraints,假设我有一个类汽车,它有一个制造商和一个颜色。一个制造商定义了一辆汽车可能被漆成的颜色。Car、Color和Manufacturer都是我在SQLAlchemy中使用声明性_base建模的表。颜色是一个具有某些属性的复杂类 我想把汽车的颜色限制在制造商指定的颜色之内。我可以使用约束或类似的东西限制汽车在SQLAlchemy中获得的颜色吗?或者我必须在纯Python中检查它吗?我认为应该处理处理定义的字符串列表所需的内容 枚举类型提供一组可能的字符串值,列将被约束到这些值。 默认情况下,使用后端的

假设我有一个类
汽车
,它有一个
制造商
和一个
颜色
。一个
制造商
定义了一辆汽车可能被漆成的颜色。Car、Color和Manufacturer都是我在SQLAlchemy中使用声明性_base建模的表。颜色是一个具有某些属性的复杂类

我想把汽车的颜色限制在制造商指定的颜色之内。我可以使用约束或类似的东西限制汽车在SQLAlchemy中获得的颜色吗?或者我必须在纯Python中检查它吗?

我认为应该处理处理定义的字符串列表所需的内容

枚举类型提供一组可能的字符串值,列将被约束到这些值。 默认情况下,使用后端的本机枚举类型(如果可用),否则使用VARCHAR+检查约束

但是从对象约束级别来看,我想您可以使用带有检查约束的ForeignKey来处理它,但是检查约束似乎只是将其直接传递到数据库,因此它将根据您正在运行的dbms而有所不同。应该能够与之配对

一种更干净、更可移植的方法可能是将其构建到构造函数中,或者只是拥有一个可以在触发查询之前验证数据的函数

## Using the Car constructor for validation

def __init__(self,color,manufacturer,price=1000):
    if color in manufacturer.allowed_colors:
        self.color = color
        self.manufacturer
    else:
        raise LookupError() # or something more relevant.
    self.price = price

## Or just a generic function that can be called:

def validate_car(color,manufacturer):
    if color in manufacturer.allowed_colors:
        return true
    return false

if validate_car(color,manufacturer):
    car = Car(color,manufacturer)
    session.add(car)
如果是我,这个验证将在我的应用程序的外围进行。假设是一个Web应用程序,这意味着它将在表单级别进行验证——只有相关的汽车颜色才会显示给用户,然后服务器将验证所选的颜色,以确保没有用户挤进坏数据。因此,我将有一个函数来
验证\u car(颜色,制造商)
,但是在处理表单时会调用它。如果表单已签出,那么我将创建并添加car对象


在dbms本身中设置约束对于级联删除来说是很有趣的,例如,如果福特决定停止销售蓝色汽车,那么您可以只删除蓝色汽车,所有蓝色的福特汽车将神奇地消失。不过,我认为如果您要走约束路线,几乎需要手动SQL将其连接起来(如果不是的话,我很乐意了解!)

我补充了一个说明。颜色不仅仅是简单的字符串:(但是谢谢!我太快地浏览了每个制造商需要有一套不同的颜色,希望编辑后的答案可能有用。