2013-01-15 25 views
0

我有一個運行sqlalachemy的Flask應用程序。我對sqlalchemy很陌生,所以我非常困惑。我做了一堆類:sqlalchemy:如何組織製作新的類實例?

用戶 場 講座 注 隊列 資產

所有這些都relationships-用戶有很多課程,課程有很多用戶,用戶有很多講座,講座有很多用戶,用戶有很多筆記,筆記有很多用戶,筆記有很多講座,講座有很多筆記,課程有很多筆記,講座有1到1個隊列,一個用戶可以有很多個隊列,一個隊列需要很多用戶等等

所以每當我創建一個演講,我必須要插入在與其相關的所有其他事情中也對它進行整理?

例如,這是我作出了新的講座

def createLecture(user, course): 
    # user and course are existing objects fetched from the db already 
    # create new lecture 
    newLecture = Lecture() 
    db.session.add(newLecture) 

    # add lecture to course, add new queue to lecture, add user to queue, add user to lecture 
    course.lectures.append(newLecture) 
    lecture.users.append(user) 
    newQueue = Queue() 
    db.session.add(newQueue) 
    newQueue.users.append(user) 
    newQueue.lecture = newLecture 
    db.session.commit() 

    return newLecture 

這令我費解的離譜和混亂編寫的代碼。除了混淆之外,我甚至不知道我是否覆蓋了我應該做的所有關係(很容易忘記有這麼多的關係)。

當它與許多其他具有各種關係的對象綁定時,必須有一些更好的方法來添加新對象。

我怎樣才能更有條理?

回答

0

由於這是一個複雜的數據庫模式,我仔細檢查了每一個關係並確保它被正確指定。

在檢查我的模式時,我發現當實例化對象時,可以實現一些關係,這是減少代碼混亂的最佳方法。

所以從我上面的例子可以寫成:

def createLecture(user, course): 
# create new lecture 
now = datetime.now() 
dt = now.strftime("%Y-%m-%d-%H-%M") 
newLecture = Lecture(dt, course) 
db.session.add(newLecture) 

# add lecture to course, add new queue to lecture, add user to queue, add new user to lecture 
newQueue = Queue(newLecture) 
db.session.add(newQueue) 
newLecture.users.append(user) 
newQueue.users.append(user) 
newLecture.groupID = pad.createGroupIfNotExistsFor(newLecture.course.name+dt)['groupID'] 

db.session.commit() 
return newLecture