【问题标题】:Django: 'User' object does not support indexingDjango:“用户”对象不支持索引
【发布时间】:2015-11-02 01:07:53
【问题描述】:

我遇到了这个问题:

“用户”对象不支持索引

自从我从 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。关于如何解决这个问题的任何想法?谢谢

【问题讨论】:

  • 之前的数据删除了吗?
  • 不,但是当我尝试时,我得到了错误:no such table: users_investment_user 我应该做一个sql flush吗?
  • 当你有一个 FK 时,你只需要一个带有相关对象 id 的字段,但是当你有一个 M2M 字段时,你需要一个额外的表,这就是你出现该错误的原因。

标签: python django django-models django-views


【解决方案1】:
instance.user = request.user

好吧,用户是 ManyToManyField,你不能只将它分配给模型,因为它是模型的“集合”。

你不想做这个吗?

instance.user.add(request.user)

【讨论】:

  • 这给了我错误:"<Investment: Investment object>" needs to have a value for field "investment" before this many-to-many relationship can be used.,引用instance.user.add(request.user) 作为问题
  • M2M 对象在保存之前无法关联。
  • 我已经保存了所有内容,here is a a pastebin,我应该保存在其他地方吗?
  • 您应该在 M2M 链接之前保存您的模型。
  • 只需将第 3 行放在第 5 行之后
【解决方案2】:

首先,您需要这行代码来将用户添加到您的对象中。

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.) 对代码进行必要的更改,例如在顶部添加或处理用户而不是用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2014-04-23
    • 2019-11-12
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2018-01-07
    相关资源
    最近更新 更多