我有一個名爲StaffSettings的Django模型,它包含我的Django應用程序中用戶的各種配置選項。每個用戶在StaffSettings表中至多有一個條目。是否有get_or_create然後更新Django中的對象的慣用方法?
假設一個設置是default_year_level,我有代碼爲我的用戶對象,如:
def set_default_year_level(u, year_level):
obj, _created = StaffSettings.objects.get_or_create(user=u)
obj.default_year_level = year_level
obj.save()
我寧願函數體,以適應在一個行,因爲它似乎是一個常見的情況,但如果我把它定義爲
def set_default_year_level(u, year_level):
StaffSettings.objects.filter(user=u).update(default_year_level=year_level)
如果有問題的用戶已經在StaffSettings表中的一行,工作正常,但如果它不存在,它不會產生相關行。
什麼是這種代碼的慣用/最好的方式? (例如,是否有某種filter_or_create
函數?或者其他人寫修飾符/助手函數來處理這個習慣用法?)
感謝您提及update()的缺陷。我想我曾經讀了一次但忘記了。我已經做了類似於你的建議,但做了set_default_values(u,** kwargs),所以我不必爲字段傳遞一個字符串,而是可以編寫像set_default_values(u,default_year_level = year_level) 。 – bryn 2013-03-20 09:58:24