2011-03-17 51 views
1

我有一個模型,我想保存一個新的實例(行)。我有ForeignKey的主鍵,但我沒有對象本身(假設它來自某處)。有沒有辦法保存它沒有原始的SQL,也沒有得到實例?如何在不檢索外部對象實例的情況下保存外鍵?

這裏是模型:

class UserLocale(models.Model): 

    user = models.ForeignKey(KingUser) 
    locale = models.ForeignKey(Locale) 

現在假設我有語言環境的主鍵(「EN_US」),但我沒有對象本身。我在做什麼,以保存它是這樣的:

def save_locale(user_instance, locale_name): 
    locale = Locale.objects.get(pk=locale_name) 
    UserLocale.objects.create(user=user_instance, locale=locale) 

我知道我可以在一個步驟原始SQL做到這一點,但我想知道如果我能在Django查詢模型做到這一點。

編輯:

是,UserLocale是M2M中間表。我知道製作ManyToMany字段會更好,但它是傳統代碼。

這裏是我的SQL嘗試(沒有測試,我的手書面方式,因爲我從代碼很遠):

def save_raw_sql(user_instance, locale_name): 

    query = """ 
      INSERT INTO 
       project_userlocale (user_id, locale_id) 
      values (%s, %s) 
      """ 

    UserLocale.objects.raw(query, [user_instance.id, locale_name]) 

回答

3

您可以只使用ID字段ForeignKey的對象底層:

UserLocale.objects.create(user=user_instance, locale_id=locale) 

(我相信參考在你的上線區域實際上應該是UserLocale)。

+0

比我想象的更簡單,謝謝! – Piva 2011-03-17 19:21:54

0
def save_locale(user_instance, locale_name): 
    user_locale = UserLocale() 
    user_locale.user = user_instance 
    user_locale.locale_id = locale_name 
    user_locale.save() 

如果u調用對象,你有.locale屬於類Locale的引用的屬性,以及包含字段實際值的.locale_id。

相關問題