17

是否可以覆盖模型中的值?我得到“MyModel”对象不支持项目分配。

my_model = MyModel.objects.get(id=1)
print my_model.title

if my_model.is_changed:
    my_model['title'] = 'something' # 'MyModel' object does not support item assignment

params = {
        'my_model': my_model,
         ...
    }
return render(request, 'template.html', params)
4

3 回答 3

36

模型是对象,而不是字典。直接在它们上设置属性:

if my_model.is_changed:
    my_model.title = 'something'

或者,如果属性名称是动态的,请使用setattr

attr_name = 'title' # in practice this would be more complex
if my_model.is_changed:
    setattr(my_model, attr_name, 'something')

这会更改模型的内存副本,但不会更改数据库 - 因为您的属性必须是一个字段,并且您可以调用saveon 方法my_model。如果您只想更改模板在其上下文中接收的内容,则不需要这样做,但只是为了完整起见:

if my_model.is_changed:
    my_model.title = 'something'
    my_model.save()

字典是可变的,如果你真的有字典:

mydict = {'title': 'foo'}
# legal
mydict['title'] = 'something'

但并非一切都是字典。

于 2013-09-12T08:50:46.283 回答
2

是的,您可以更改值,但这不是它的完成方式。Django 模型是具有表示字段的模型的 Python 类。例如 aCharField用于在数据库中保存一个字符串。让我演示一下(来自 django 文档的代码):

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

正如您在上面看到的,Python 类是一个自定义的 Django 模型。它链接到数据库,当您运行时manage.py syncdb,它将与您的数据库交互以创建您需要的表和列。

现在,在你的情况下:

if my_model.is_changed:
    my_model.title = "Something"
    my_model.save()
于 2013-09-12T08:51:16.967 回答
0

my_model is an object. So, try this:

if my_model.is_changed:
    my_model.title = 'something'
    my_model.save()
于 2013-09-12T08:52:55.913 回答