Django:即使在未定义的字段中,模型对象也可以节省价值吗?

时间:2018-04-30 07:07:07

标签: python django django-models

我有Symbol型号:

class Symbol(models.Model):

    market = models.CharField(         
        max_length=20,
        null=True,
        blank=True,
    )

并生成一些Symbol模型数据。

我感到惊讶的是:

>>> s = Symbol.objects.first()
>>> s.i_dont_know = 1
>>> s.save()

没有出现任何错误?

为什么不出现任何错误?

2 个答案:

答案 0 :(得分:2)

当您在模型对象上调用save方法时,它将仅更新我们在模型中定义的模型字段。将忽略模型对象的所有其他属性。这就是你没有得到任何错误的原因。

答案 1 :(得分:0)

  

为什么不出现任何错误?

Model上,您可以定义零个或多个在数据库中具有等效项的字段,但除此之外,您还可以在模型上添加零个或多个函数,属性,属性等。

你可能已经以某种方式做到了。例如:

class Symbol(models.Model):

    market = models.CharField(         
        max_length=20,
        null=True,
        blank=True,
    )

    def __init__(self, *args, **kwargs):
        super(Symbol, self).__init__(*args, **kwargs)
        self.cache = {}

    @property
    def market3(self):
        return self.market and self.market[:3]

毕竟这些模型实际上是Python对象,附加了一些魔法,如果你改变一个属性并且有一个同名的字段,那么它对应于那个字段。但通常模型还有一些额外的逻辑和属性,使它们更智能,在模型级别处理部分请求,计算依赖于一个或多个字段的属性等。

写作:

s.i_dont_know = 1

将一个属性附加到名为s且值为'i_dont_know'的{​​{1}}对象。但请注意,此属性持久性:如果您保存对象,稍后从数据库重新加载它,那么您附加到它的所有额外数据将会消失。除非你定义一个增加一些额外逻辑的setter。