2013-02-13 65 views
0

比方說,我有一個類CarManufacturerColor。 A Manifacturer定義了可能塗漆汽車的顏色。汽車,顏色和製造商都是我用SQLAlchemy中的declarative_base建模的表格。顏色是一個複雜的類,有一些屬性。如何確保屬性具有特定的值?

我想將汽車的顏色限制爲製造商指定的顏色。我可以使用限制或類似的東西來限制Color獲取SQLAlchemy的顏色嗎?還是必須檢查純Python中的?

回答

1

我相信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來把它掛上去(儘管我很樂意學習,如果它不是!)。

+0

我補充說明。顏色不僅僅是簡單的字符串:(但是,謝謝! – AME 2013-02-13 17:13:17

+1

我太快速瀏覽了每個製造商需要不同的顏色,希望編輯的答案可能會有用。 – Doobeh 2013-02-13 21:18:28

相關問題