使用不存在的字段保存模型实例

时间:2016-11-30 09:13:34

标签: python django

我不知道这是一个bug还是Django只允许它发生。我有一个Django模型:

class Author(models.Model):
    name = models.CharField(max_length=128)

我创建了一个实例,并为不存在的字段address分配了一个值:

author = Author()
author.name = 'abce'
author.address = 'defg'
author.save()

实例已成功保存,并且没有错误消息。这是正常的吗?

3 个答案:

答案 0 :(得分:1)

是正常的,地址永远不会被保存,如果你再次引用这个对象,它就不会存在。它只是Python qwerk,你可以随时在对象实例中添加字段

class A:
    pass
a = A()
a.foo = 1

你是否应该是另一回事......

答案 1 :(得分:1)

在Python中,用户定义的类型通常为mutable,这意味着可以更改它们,向用户定义的attribute添加object就像添加{{} 1}}到普通的key。您可以查看此答案以获取更多详细信息are user defined classes mutable

答案 2 :(得分:1)

是的正常。 Django只会为您定义的字段进行更新

来自django代码

    for field in self._meta.concrete_fields:
        if field.attname in non_loaded_fields:
            # This field wasn't refreshed - skip ahead.
            continue
        setattr(self, field.attname, getattr(db_instance, field.attname))

您可以按

查看字段
Author()._meta.concrete_fields

但你不能这样做

Author(name="name", address="sss")

会引发无效论证。