Django模型字段如何工作?

2024-05-19 09:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不喜欢网络编程。我碰到了django,读了一些关于模特的文章。我对以下代码很感兴趣(来自djangproject.com网站)以下内容:


class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __str__(self):
        # Note use of django.utils.encoding.smart_str() here because
        # first_name and last_name will be unicode strings.
        return smart_str('%s %s' % (self.first_name, self.last_name))

根据我对python的理解,名字和姓氏都是类变量,对吗?如何在代码中使用它(因为我猜是这样的设置个人姓名或者个人姓氏会影响所有人实例)?为什么用这种方式?在


Tags: django代码nameself网络smartmodels编程
3条回答

是的,名字和姓氏都是类变量。它们定义将在数据库表中创建的字段。有一个Person表包含first_name和last_name列,因此此时将它们放在类级别是有意义的。在

有关模型的更多信息,请参见: http://docs.djangoproject.com/en/dev/topics/db/models/

在代码中访问Person的实例时,通常是通过Django的ORM来完成的,此时它们基本上表现为实例变量。在

有关模型实例的详细信息,请参见: http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

不是一个真正的答案,而是为了丰富:

Person.first_name 

不会有用的

^{pr2}$

会有用的。所以person的对象实例有名字和姓氏,但静态上下文person没有。在

另请注意:Django有允许“Person”执行静态queryset操作的模型管理器。(https://docs.djangoproject.com/en/dev/topics/db/managers/#经理). 在

例如

peoples = Person.objects.all()

你的问题的实质是“这些类变量(我为其分配字段对象)为什么突然变成Django的ORM中的实例变量(我为其分配数据)?答案是Pythonmetaclasses的魔力。在

元类允许您钩住并修改创建Python类的过程(不是创建该类的实例,而是创建类本身)。在

Django的Model对象(以及您的模型,它们是子类)有一个ModelBase metaclass。它会检查模型的所有类属性,以及字段子类的实例,并将其移到字段列表中。该列表被指定为_meta对象的属性,该对象是模型的类属性。因此,您总是可以通过MyModel._meta.fields,或MyModel._meta.get_field('field_name')来获得实际的Field对象。在

然后,Model.__init__方法可以使用_meta.fields列表来确定在创建模型实例时应该初始化哪些实例属性。在

不要害怕深入研究Django源代码;它是一个很好的教育来源!在

相关问题 更多 >

    热门问题