1. def contribute_to_class(self, cls, name):
  2. self.set_attributes_from_name(name)
  3. self.model = cls
  4. cls._meta.add_field(self)
  5. if self.choices:
  6. setattr(cls, 'get_%s_display' % self.name,
  7. curry(cls._get_FIELD_display, field=self))

上面在Field类中定义的contribute_to_class(self, cls, name),该类调用_meta.add_field(self)

  1. def add_field(self, field):
  2. # Insert the given field in the order in which it was created, using
  3. # the "creation_counter" attribute of the field.
  4. # Move many-to-many related fields from self.fields into
  5. # self.many_to_many.
  6. if field.rel and isinstance(field.rel, ManyToManyRel):
  7. self.local_many_to_many.insert(bisect(self.local_many_to_many, field), field)
  8. if hasattr(self, '_m2m_cache'):
  9. del self._m2m_cache
  10. else:
  11. self.local_fields.insert(bisect(self.local_fields, field), field)
  12. self.setup_pk(field)
  13. if hasattr(self, '_field_cache'):
  14. del self._field_cache
  15. del self._field_name_cache
  16.  
  17. if hasattr(self, '_name_map'):
  18. del self._name_map

add_field会把field加到meta对象中。

  1. fields = property(_fields)
  2.  
  3. def get_fields_with_model(self):
  4. """
  5. Returns a sequence of (field, model) pairs for all fields. The "model"
  6. element is None for fields on the current model. Mostly of use when
  7. constructing queries so that we know which model a field belongs to.
  8. """
  9. try:
  10. self._field_cache
  11. except AttributeError:
  12. self._fill_fields_cache()
  13. return self._field_cache
  14.  
  15. def _fill_fields_cache(self):
  16. cache = []
  17. for parent in self.parents:
  18. for field, model in parent._meta.get_fields_with_model():
  19. if model:
  20. cache.append((field, model))
  21. else:
  22. cache.append((field, parent))
  23. cache.extend([(f, None) for f in self.local_fields])
  24. self._field_cache = tuple(cache)
  25. self._field_name_cache = [x for x, _ in cache]

调用meta的fields会返回model的所有field

model实例化要取得所有的field

django 的model是如何把字段加入到meta中的的更多相关文章

  1. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  2. django使用model创建数据库表使用的字段

    Django通过model层不可以创建数据库,但可以创建数据库表,以下是创建表的字段以及表字段的参数.一.字段1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一 ...

  3. django的model字段在保存的时候做预处理怎么办?

    django的model字段在保存的时候做预处理怎么办? 比如这个model: class Book(Model): publish_date = DateField() 但是在保存时,用户输入数据是 ...

  4. Django之Model操作

    Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...

  5. Django基础——Model篇(三)

    一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...

  6. Django基础——Model篇(二)

    一 Model连表关系 一对多:models.ForeignKey(其他表)    多对多:models.ManyToManyField(其他表)    一对一:models.OneToOneFiel ...

  7. Django基础——Model篇(一)

    到目前为止,当程序涉及到数据库相关操作时,我们一般都会这么操作:    (1)创建数据库,设计表结构和字段    (2)使用MySQLdb来连接数据库,并编写数据访问层代码    (3)业务逻辑层去调 ...

  8. Django之Model组件

    Model组件在django基础篇就已经提到过了,本章介绍更多高级部分. 一.回顾 1.定义表(类) ##单表 from django.db import models class user(mode ...

  9. Django之Model

    一.字段 常用字段: AutoField:int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntergerField:一个 ...

随机推荐

  1. 关于Excel导出实例(适合新手,比较详细)

    需要源代码的可以加我微信好友gqljxg1514 1,首先配置依赖pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  2. Selenium2+python自动化-查看selenium API

    前面都是点点滴滴的介绍selenium的一些api使用方法,那么selenium的api到底有多少呢?本篇就叫大家如何去查看selenium api,不求人,无需伸手找人要,在自己电脑就有. pydo ...

  3. flask中自定义过滤器

    第一种方法: 1,第一步:自定义过滤器函数 # 自定义一个函数,将list里面的数据进行排序 def list_sort(list) return list.sort() 2.第二步:注册过滤器 第一 ...

  4. es6学习日记3

    函数的扩展 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); } ...

  5. c——动态数组

    动态数组的实现 #include<stdio.h> #include<stdlib.h> int main(){ int i,n,*a; scanf("%d" ...

  6. 在Linux中执行.sh脚本,异常

    在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory. 分析:这是不同系统编码格式引起的:在windows系统中 ...

  7. zookeeper集群和安装dubbo的管控台

    准备三台服务器CentOs6: 192.168.37.132 192.168.37.128 192.168.37.131 1 将zookeeper的安装包分别解压到/usr/local/目录下 进入c ...

  8. Pycharm自动添加文件头

    Pycharm自动添加文件头 在编程的时候,我们往往需要在文件头里添加一些编码和作者信息,在Pycharm中,系统给我们自带了这一功能,可以做如下设置: 打开设置 在设置中找到如下选项: 然后在编辑框 ...

  9. java 实现自定义事件

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...

  10. python中的copy.copy和copy.deepcopy

    一个例子就搞清楚 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 ...