比方說,我有一個類Car
有Manufacturer
和Color
。 A Manifacturer
定義了可能塗漆汽車的顏色。汽車,顏色和製造商都是我用SQLAlchemy中的declarative_base建模的表格。顏色是一個複雜的類,有一些屬性。如何確保屬性具有特定的值?
我想將汽車的顏色限制爲製造商指定的顏色。我可以使用限制或類似的東西來限制Color獲取SQLAlchemy的顏色嗎?還是必須檢查純Python中的?
比方說,我有一個類Car
有Manufacturer
和Color
。 A Manifacturer
定義了可能塗漆汽車的顏色。汽車,顏色和製造商都是我用SQLAlchemy中的declarative_base建模的表格。顏色是一個複雜的類,有一些屬性。如何確保屬性具有特定的值?
我想將汽車的顏色限制爲製造商指定的顏色。我可以使用限制或類似的東西來限制Color獲取SQLAlchemy的顏色嗎?還是必須檢查純Python中的?
我相信sqlalchemy.types.Enum應該處理你需要處理一個定義的字符串列表。
Enum類型提供了一組可能的字符串值,這些字符串值被限制。 默認情況下,使用後端的本地ENUM類型(如果可用),否則使用VARCHAR + CHECK約束。
但是從對象約束級別看它,我想你可以用帶有Check約束的ForeignKey處理它,但似乎檢查約束只是直接將它傳遞給數據庫,所以它會根據你正在運行什麼dbms。 This question goes deeper into the SQL這應該可以配對SQLAlchemy's Constraints。
一個更清潔,更便攜的方式可能是將其建成構造函數,或者只是有查詢被解僱
## 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應用程序,這意味着它將在表單級別上進行驗證 - 只有相關的汽車顏色纔會顯示給用戶,然後服務器將驗證所選的顏色,以確保沒有用戶擠壓壞數據。所以我會有一個函數validate_car(color,manufacturer)
,但是當表單被處理時會調用它,如果表單被檢出,那麼我會創建並添加Car對象。
在dbms本身中具有約束對於級聯刪除很有趣,如果福特決定停止銷售藍色汽車,那麼你可以刪除藍色,而所有藍色福特汽車都會奇蹟般地消失,不過,我認爲如果你要走約束路線,那幾乎是手動SQL來把它掛上去(儘管我很樂意學習,如果它不是!)。
我補充說明。顏色不僅僅是簡單的字符串:(但是,謝謝! – AME 2013-02-13 17:13:17
我太快速瀏覽了每個製造商需要不同的顏色,希望編輯的答案可能會有用。 – Doobeh 2013-02-13 21:18:28