Django: Django模型是数据类吗?



我们可以说Django模型是数据类吗?我没有在它们或它们的基类模型上看到@dataclass注释。然而,我们确实把它们当作数据类,因为它们没有构造函数,我们可以通过命名它们的参数来创建新对象,例如MyDjangoModel(arg1=…,最长=…)。另一方面,Django模型也没有init方法(构造函数)或继承NamedTuple类。

创建新的Django模型对象时发生了什么?

发生在模型上的很多神奇的东西,如果不是全部的话,都来自于它的基元类。

这可以在django.db.models.ModelBase中找到,特别是在__new__函数中。

无论__init__方法是否被定义(实际上,这是根据Abdul的评论),并不意味着它可以或应该被认为是一个数据类。

正如其他人在这篇文章中非常雄辩地描述的那样;

什么是数据类,它们与普通类有何不同?

尽管django模型很清楚,很明显似乎有一些数据存储在其中,但模型更像是一组易于使用(和重用)的函数,它们利用数据库后端,这是存储对象的真实状态的地方,模型只是给它访问权限。

同样值得注意的是,模型不存储数据,而只是检索数据。

以下面这个简单的模型为例:

class Person(models.Model):
name = models.CharField()

然后我们在shell中做了这样的操作:

person = Person.objects.get(...)
print(person.name)

当我们访问该属性时,django实际上是在向数据库请求信息,并生成一个查询来获取值。

值不是实际上存储在模型对象本身。

考虑到这一点,从本质上讲,django模型不是数据类。它们是普通的常规类。

Django不支持数据类。您可以定义一个自定义的模型字段。但这可能需要一些开发工作。