Geo*_*Geo 10 python django django-models
首先,我不是网络编程.我碰到了django并且读了一些关于模特的内容.我对以下代码感兴趣(来自djangoproject.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))
Run Code Online (Sandbox Code Playgroud)
根据我对python的理解,first_name和last_name是类变量,对吗?如何在代码中使用(因为我猜设置Person.first_name或Person.last_name会影响所有Person实例)?为什么这样使用?
Car*_*yer 21
你的问题的实质是"为什么这些类变量(我将Field对象赋予)突然变成实例变量(我将数据分配给Django的ORM")?答案就是Python 元类的神奇之处.
元类允许您挂钩并修改创建Python类的过程(不是创建该类的实例,创建类本身).
Django的Model对象(以及您的模型,也是子类)具有ModelBase元类.它会查看模型的所有类属性,以及任何属于Field子类的实例,它会移动到字段列表中.该列表被指定为_meta
对象的属性,该属性是模型的类属性.因此,您始终可以通过MyModel._meta.fields
或获取实际的Field对象MyModel._meta.get_field('field_name')
.
Model.__init__
然后,该方法可以使用该_meta.fields
列表来确定在创建模型实例时应初始化哪些实例属性.
不要害怕潜入Django源代码; 这是一个很好的教育来源!
是的,first_name 和 last_name 是类变量。它们定义将在数据库表中创建的字段。有一个包含 first_name 和 last_name 列的 Person 表,因此此时它们处于 Class 级别是有意义的。
有关模型的更多信息,请参阅:http : //docs.djangoproject.com/en/dev/topics/db/models/
当涉及到在代码中访问 Person 的实例时,您通常是通过 Django 的 ORM 来执行此操作的,此时它们基本上表现为实例变量。
有关模型实例的更多信息,请参阅:http : //docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs
归档时间: |
|
查看次数: |
3136 次 |
最近记录: |