2015-11-02 29 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)使代码顶部的必要更改可以添加或处理用户而不是用户。