如何使用 Django 在模型对象中分配项目?

Posted

技术标签:

【中文标题】如何使用 Django 在模型对象中分配项目?【英文标题】:How to assign items inside a Model object with Django? 【发布时间】:2013-09-16 13:22:15 【问题描述】:

是否可以覆盖模型中的值? 我得到 '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)

【问题讨论】:

您要达到的目标是什么? 只是为了在我的模板中显示另一个标题,以防它被更改。这个“另一个标题”获取另一个表 【参考方案1】:

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

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'

但并非一切都是字典。

【讨论】:

天啊,多么愚蠢的错误!谢谢! 一般来说,对象属性实际上存储为一个字典(my_model.__dict__,在这种情况下),所以你的直觉并没有错。但是有非常充分的理由不直接访问或编辑该词典。 @PeterDeGlopper 我相信您需要致电 .save() 才能更新 django 模型。 @GamesBrainiac 如果您希望将编辑记录到数据库中,可以。我打算在答案中声明:“这会更改模型的内存副本,但不会更改数据库 - 因为您的属性必须是一个字段,并且您可以调用 save方法。”你认为这缺少什么吗?如有必要,我将编辑更多信息。 @PeterDeGlopper 我认为您的回答很完美,只是一些 django 文档的链接将是最重要的! :D 我总是这样做,因为通常情况下,文档会提供您想要的所有答案。【参考方案2】:

是的,您可以更改值,但这不是它的完成方式。 Django 模型是具有表示字段的模型的 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()

【讨论】:

@PeterDeGlopper 谢谢你,我在另一个论坛上编辑另一个问题,所以我在那里和这里都粘贴了错误的东西! :P【参考方案3】:

my_model 是一个对象。所以,试试这个:

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

【讨论】:

以上是关于如何使用 Django 在模型对象中分配项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环Django中分配外键

如何正确更改 Django Web 应用程序中分配的密钥

如何防止声明为局部变量的对象在堆栈中分配?

如何在 c# 中分配后保留有关对象的信息?

如何从对象中获取数据并在html中的元素中分配 - javascript代码[关闭]

.NET 如何测量请求中分配的字节数?