博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

django的表

Posted on 2018-01-30 14:18  bw_0927  阅读(143)  评论(0)    收藏  举报

在django中,有两张表极为重要:

django_content_type,这个地方定义了django工程认可的app。这些app都是要进行migrate的对象。
还有一张表:django_migrations表,记录了django迁移的过程。

 

http://blog.csdn.net/laughing2333/article/details/53014267

Django ContentTypes做了什么?

当使用django-admin初始化一个django项目的时候,可以看到在默认的INSTALL_APPS已经包含了django.contrib.contenttypes:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

而且注意django.contrib.contenttypes是在django.contrib.auth之后,这是因为auth中的permission系统是根据contenttypes来实现的。

笔者紧接着查阅了一下django.contrib.contenttypes.models文件:

class ContentType(models.Model):
    app_label = models.CharField(max_length=100)
    model = models.CharField(_('python model class name'), max_length=100)
    objects = ContentTypeManager()

    class Meta:
        verbose_name = _('content type')
        verbose_name_plural = _('content types')
        db_table = 'django_content_type'
        unique_together = (('app_label', 'model'),)

    def __str__(self):
        return self.name

 

大家可以看到ContentType就是一个简单的django model,而且它在数据库中的表的名字为django_content_type。 
有经验的Django开发者对于这个表的名字一般都不会陌生,在第一次对Django的model进行migrate之后,就可以发现在数据库中出现了一张默认生成的名为django_content_type的表。 
如果没有建立任何的model,默认django_content_type是这样的:

sqlite> select * from django_content_type;
1|admin|logentry
2|auth|group
3|auth|user
4|auth|permission
5|contenttypes|contenttype
6|sessions|session

因此,django_content_type记录了当前的Django项目中所有model所属的app(即app_label属性)以及model的名字(即model属性)。 

 

当然,django_content_type并不只是记录属性这么简单,在一开始的时候笔者就提及了contenttypes是对model的一次封装,因此可以通过contenttypes动态的访问model类型,而不需要每次import具体的model类型。

  • ContentType实例提供的接口 
    • ContentType.model_class() 
      • 获取当前ContentType类型所代表的模型类
    • ContentType.get_object_for_this_type() 
      • 使用当前ContentType类型所代表的模型类做一次get查询
  • ContentType管理器(manager)提供的接口 
    • ContentType.objects.get_for_id() 
      • 通过id寻找ContentType类型,这个跟传统的get方法的区别就是它跟get_for_model共享一个缓存,因此更为推荐。
    • ContentType.objects.get_for_model() 
      • 通过model或者model的实例来寻找ContentType类型

至于实际的例子可以去参考官方文档