是否可以覆盖模型中的值? 我收到'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)
答案 0 :(得分:20)
模型是对象,而不是字典。直接在它们上设置属性:
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')
这会更改模型的内存中副本,但不会更改数据库 - 因为您的属性必须是字段,并且您在my_model
上调用save
方法。如果您只想更改模板在其上下文中接收的内容,则不需要这样做,但仅仅是为了完整性:
if my_model.is_changed:
my_model.title = 'something'
my_model.save()
如果你真的有字典,字典是可变的:
mydict = {'title': 'foo'}
# legal
mydict['title'] = 'something'
但并非一切都是字典。
答案 1 :(得分:2)
是的,您可以更改值,但这不是它的完成方式。 Django Models是具有表示字段的模型的Python类。例如,CharField
用于在数据库中保存字符串。让我演示一下(code from django docs):
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()
答案 2 :(得分:0)
my_model是一个对象。所以,试试这个:
if my_model.is_changed:
my_model.title = 'something'
my_model.save()