Django模型是如何工作的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

所以我可以创建这样的Django模型:

from django.db import models

class Something(models.Model):
    title = models.TextField(max_length=200)

我可以这样做:

thing = Something()
#set title
thing.title = "First thing"
#get title
thing.title

一切正常,但我想了解它是如何工作的。

title = models.TextField(max_length=200)

在非Django Python代码中,上面的代码定义了类型模型的类变量标题。TextField和我也可以这样访问它:thing.__class__.title

但是在Django中,当我创建某物的实例时,我突然有了一个title属性,在这里我可以获得/设置文本。并且无法使用thing.__class__.title很明显,在做这些事情的时候,我并不是在访问类变量“title”,而是一些生成的属性/属性,或者?

我知道田里的事结束了。_元.字段但是怎么做?怎么回事,怎么回事?

1,Django是否在幕后创建了属性“title”?

2、类变量“title”发生了什么变化?

提问于
用户回答回答于

基本上是元类定义如何创建类本身。在创建过程中,可以将其他属性/方法/任何东西绑定到该类。并将其大写为

# remember that `type` is actually a class like `str` and `int`
# so you can inherit from it
class UpperAttrMetaclass(type): 
    # __new__ is the method called before __init__
    # it's the method that creates the object and returns it
    # while __init__ just initializes the object passed as parameter
    # you rarely use __new__, except when you want to control how the object
    # is created.
    # here the created object is the class, and we want to customize it
    # so we override __new__
    # you can do some stuff in __init__ too if you wish
    # some advanced use involves overriding __call__ as well, but we won't
    # see this
    def __new__(upperattr_metaclass, future_class_name, 
                future_class_parents, future_class_attr):

        attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
        uppercase_attr = dict((name.upper(), value) for name, value in attrs)

        return type(future_class_name, future_class_parents, uppercase_attr)

以类似的方式,Django的模型元类可以消化应用于类的属性,并添加各种有用的属性来进行验证/等等,包括甚至方法和什么-不。

用户回答回答于

Python非常强大,并且允许开发人员使用intResponse。

Django使用了大量的元类,而且看起来模型也使用它。参见Django\db\model\base.py

class Model(object):
    __metaclass__ = ModelBase

我认为元类只是接受了类属性,比如一个字段,对于这些Model子类的所有新实例,创建A固有变量。

1)是的,Django以同样的方式创建属性“title”的实例变量“title”2),元类将字段移动到元类中...

扫码关注云+社区