首先,我不喜欢网络编程。我碰到了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的理解,名字和姓氏都是类变量,对吗?如何在代码中使用它(因为我猜是这样的设置个人姓名或者个人姓氏会影响所有人实例)?为什么用这种方式?在
是的,名字和姓氏都是类变量。它们定义将在数据库表中创建的字段。有一个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
不是一个真正的答案,而是为了丰富:
不会有用的
^{pr2}$会有用的。所以person的对象实例有名字和姓氏,但静态上下文person没有。在
另请注意:Django有允许“Person”执行静态queryset操作的模型管理器。(https://docs.djangoproject.com/en/dev/topics/db/managers/#经理). 在
例如
你的问题的实质是“这些类变量(我为其分配字段对象)为什么突然变成Django的ORM中的实例变量(我为其分配数据)?答案是Pythonmetaclasses的魔力。在
元类允许您钩住并修改创建Python类的过程(不是创建该类的实例,而是创建类本身)。在
Django的Model对象(以及您的模型,它们是子类)有一个ModelBase metaclass。它会检查模型的所有类属性,以及字段子类的实例,并将其移到字段列表中。该列表被指定为
_meta
对象的属性,该对象是模型的类属性。因此,您总是可以通过MyModel._meta.fields
,或MyModel._meta.get_field('field_name')
来获得实际的Field对象。在然后,
Model.__init__
方法可以使用_meta.fields
列表来确定在创建模型实例时应该初始化哪些实例属性。在不要害怕深入研究Django源代码;它是一个很好的教育来源!在
相关问题 更多 >
编程相关推荐