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将其连接起来(如果不是的话,我很乐意了解!)我补充了一个说明。颜色不仅仅是简单的字符串:(但是谢谢!我太快地浏览了每个制造商需要有一套不同的颜色,希望编辑后的答案可能有用。