2015-11-02 75 views
1

我已經招致了問題:Django的:「用戶」對象不支持索引

'User' object does not support indexing

自從我從一個ForeignKey改爲ManyToManyField的人,讓用戶:

user = models.ManyToManyField(User) # Was ForeignKey before 

這裏是我的views.py文件:

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.user = request.user # The problem I'm guessing 
    instance.offered_fund = default_state 
    instance.save() 

我試圖按照指示找到here沒有成功。另外我使用Python3,如果這與問題有任何關係。關於如何解決這個問題的任何想法?謝謝

+0

您是否刪除了以前的數據? – Gocht

+0

不,但是當我嘗試我得到的錯誤:'沒有這樣的表:users_investment_user'我應該做一個'sql flush'嗎? – ng150716

+1

當你有一個FK時,你只需要一個帶有相關對象ID的字段,但是當你有一個M2M字段時,你需要一個額外的表格,這就是你爲什麼要這樣做的原因。 – Gocht

回答

1
instance.user = request.user 

那麼,用戶是ManyToManyField,你不能只是將它分配給模型,因爲它是模型的「集合」。

難道你不想這樣做嗎?

instance.user.add(request.user) 
+0

這給了我一個錯誤:''<投資:投資對象>「需要在字段」投資「中有一個值,然後才能使用多對多關係。」,引用'instance.user.add(request。用戶)'作爲問題 – ng150716

+0

在保存之前,您無法關聯M2M對象。 – mingaleg

+0

我已經保存了一切,[這裏是一個pastebin](http://pastebin.com/TxG7vfdJ),我應該保存在別的地方嗎? – ng150716

0

首先,您需要這行代碼將用戶添加到您的對象。

instance.user.add(request.user) 

代替

instance.user = request.user 

但是,你還需要運行一些改變目前的外鍵的用戶轉換到新的M2M用戶數據。

所以我建議以下步驟首先要做到:

1)建立一個新的M2M關係,並保持現有的外鍵也。

user = models.ForeignKey(User) 
users = models.ManyToManyField(User) 

2.)立即遷移數據庫。

python manage.py makemigrations 
python manage.py migrate 

3.)從終端運行以下代碼以遷移數據。

for obj in Model.objects.all(): 
    obj.users.add(obj.user) 

4)刪除舊的用戶字段(也改變了用戶對用戶而言,如果你願意,但我會建議爲users用來反映多個。再次遷移。

5)使代碼頂部的必要更改可以添加或處理用戶而不是用戶。