我有以下型号:

class Ticket(models.Model):
    title = models.CharField()
    merged_to = models.ForeignKey("self", related_name='merger_ticket', null=True, blank=True)
    looser_ticket = models.BooleanField(default=False)

操纵模型的方法有两种:

First

ticket = Ticket.objects.get(pk=1)
ticket.title = "This is edit title"
ticket.merged_to_id = 2
ticket.looser_ticket = True

Second

ticket = Ticket.objects.get(pk=1)
setattr(ticket, "title", "Edit Title")
setattr(ticket, "merged_to_id", 2)
setattr(ticket, "looser_ticket", True)

当我操作这些东西的时候,在布尔值更新的视图中,第一种方法不起作用,但是第二种方法起作用了.第一次使用和第二次使用有什么不同,应该在什么时候使用?

谢谢!

推荐答案

这更像是一个Python问题.

Python是一种非常动态的语言.您可以提前编写代码(类),或者Python允许您在运行时完全动态地创建类.请考虑以下简单向量类的示例.您可以提前创建/编码类,如下所示:

class MyVector(object):
    x = 0
    y = 0

或者,您可以通过执行以下操作来动态创建类:

fields = {'x':0, 'y':0}
MyVector = type('MyVector', (object,), fields)

这两种方法之间的主要区别是,对于一种方法,您可以提前知道类属性,而对于第二种方法,正如您可以想象的那样,您可以通过编程创建fields字典,因此您可以完全动态地创建一个或多个类.

因此,当您提前知道类的属性时,可以使用对象表示法设置类属性:

instance.attribute = value

请记住,这相当于:

instance.__setattr__("attribute", value)

但是,在某些情况下,您不知道需要提前操作的类属性.这是您可以使用__setattr__函数的地方.但是,这不是推荐的做法.因此,建议使用Python的内置方法setattr,该方法在内部调用__setattr__方法:

setattr(instance, attribute, value)

使用这种方法,你可以提前设置你不知道的属性,或者你甚至可以循环大约dict个,并从dict设置值:

values = {
    'title': 'This is edit title',
    ...
}
for k, v in values.items():
    setattr(ticket, k, v)

不确定为什么常规记法不起作用.这可能与您用来设置属性的方法无关.

Django相关问答推荐

Django模型ManyToManyField.Add不起作用

如何在 Django REST Framework API 响应中使用多标签过滤器?

Django 仅预取相关模型的最新对象

基于模型多选字段在模板django中显示结果

Django ORM:获取每个类别的月平均价格

使用 south 重构具有继承的 Django 模型

获取结果集中返回的元素数的 django 模板标签是什么?

在 Django 的 TextField 中禁用 HTML 转义

Django - 站点匹配查询不存在

Django 相当于 COUNT 和 GROUP BY

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

在 Django REST Framework 中找不到资源时如何返回 404

Django - 如何从模型中 Select 特定列?

URL命名空间的一个真实例子

Python Django:您正在使用 staticfiles 应用程序而没有设置 STATIC_ROOT 设置

Django将HttpResponseRedirect返回到带有参数的url

如何使 Django 表单字段仅包含字母数字字符

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

过滤查询参数

它是如何工作的,Django INSTALLED_APPS 的命名约定?