浅析django的abstract,proxy, managed

django.db.models.Model 的 Meta参数
参数 类型 说明 继承
abstract boolean 是否建表 不继承,子类自动充值为默认值(False)
managed boolean 是否自动建表 不继承,子类自动充值为默认值(True)
proxy boolean 是否为代理类(不建表) 不继承,子类自动充值为默认值(False)

proxy的继承特性,示例代码如下:

原始类Author

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True,verbose_name=‘e-mail‘)

    def __unicode__(self):
        return u‘%s %s‘ % (self.first_name, self.last_name)

代理类 AuthorProxy

class AuthorProxy(Author):
    class Meta:
        proxy = True

代理类子类 AuthorProxy2

class AuthorProxy2(AuthorProxy):
    pass

通过sqlall查看(django 1.6.5),建表如下:

CREATE TABLE "books_authorproxy2" (
    "author_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "books_author" ("id") DEFERRABLE INITIALLY DEFERRED
);

因此,可以断定,proxy在继承中的特性跟abstract一样。

将以上代码中的proxy换成managed ,并设置为 False,经测试,生成sql如下:

CREATE TABLE "books_authorproxy2" (
    "authorproxy_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "books_authorpoxy" ("author_ptr_id") DEFERRABLE INITIALLY DEFERRED
);

即,managed不会继承到子类,子类会默认重置为True

用途

proxy or managed?

官方是这么说的:

So, the general rules are:

1. If you are mirroring an existing model or database table and don’t want all the original database table columns, use Meta.managed=False. That option is normally useful for modeling database views and tables not under the control of Django.
2. If you are wanting to change the Python-only behavior of a model, but keep all the same fields as in the original, use Meta.proxy=True. This sets things up so that the proxy model is an exact copy of the storage structure of the original model when data is saved.

即,通常:

1. 如果你要映射模型到已经存在的数据库,使用managed=False, 这适合不在django控制之下的数据库表和视图。

2. 如果只想要给模型修改python行为,而不需要改变任何字段,使用 proxy=True, 这会保持模型类的数据跟原始表结构一样(实际上就是一个表)

abstract

基本上,父类(abstract)的字段会拷贝到子类的每一个表中(如果子类没有设置Meta.abstract=True), 因此适合的情形,比如给所有表增加一些共性字段,比如创建人等信息。

时间: 2024-11-05 03:05:57

浅析django的abstract,proxy, managed的相关文章

django拓展用户proxy代理

1.app0 1 /models.py里面定义User代理模型Person. from django.db import modelsfrom django.contrib.auth.models import User class Person(User): class Meta: proxy = True @classmethod def get_blacklist(cls): return cls.objects.all() 说明: 代理模型不能定义models模型字段,比如,Person

scala collection详解

原帖:http://stackoverflow.com/questions/1722137/scala-2-8-collections-design-tutorial There's a 2.8 collection walk-through by Martin Odersky which should probably be your first reference. It has been supplemented as well with architectural notes, whic

Bootstrap 实战之响应式个人博客 (一)

一.示例 1.主页 2.博客详情页 3.在线地址 在线地址:入口 Addition:这里使用github-page将自己的静态项目免费部署到线上. 如果你只是做一些简单的静态项目做展示,付出这么大的时间和经济成本去专门购买一台云服务器显然是得不偿失的.github提供了github-page让用户可以免费部署自己的静态站点.更多参考:github-page 在本项目的静态站点部署时与其他的代码仓库,提交同步没有太大的区别(言外之意:还是有点不同的): 第一点:需要将项目目录名设置为 "githu

django Proxy models ---- 代理模式

一个proxy models 不会在数据库中创建新的表.而是与它的基类共用同一个表 1.model 的定义: from django.db import models # Create your models here. class Person(models.Model): name=models.CharField(max_length=8) class ProxyPerson(Person): class Meta: proxy=True def doSomething(self): pa

Django model 中meta options之 abstract

当abstract=True时,这个model就变成了abstrct base class,那这个基类有什么特性呢? 当某一model中设置了abstract=True时,就会使该model中的字段都不会产生对应的表,而是可以作为基类加入到其他model中 那有什么用呢? 有时多个model有些相同的字段,这样很浪费时间,而且重复本身也不利于代码简洁.好该abstract来了 看官例: from django.db import models class CommonInfo(models.Mo

django 事务错误 -- Transaction managed block ended with pending COMMIT/ROLLBACK

1 Request Method: GET 2 Request URL: http://192.168.128.111:8000/×××/××××/ 3 Django Version: 1.4.8 4 Exception Type: TransactionManagementError 5 Exception Value: 6 Transaction managed block ended with pending COMMIT/ROLLBACK 今天在做事务处理的时候老是出现这个问题,我研究了

浅析java修饰符之public default protected private static final abstract

浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 二   分类(大致分两类) 1.访问修饰符,包括:public default protected private 2.非访问修饰符,包括:static final abstract 三 访问修饰符--Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权

django 基于proxy实现用户权限管理

项目中经常会遇到用户权限管理的问题,django adminsite已经提供非常实用的用户权限管理机制.不过有些时候,我们希望根据相关用户属性来过滤adminsite中显示的内容.下文将结束如何实现: 原始类 假设我有这么一个问卷类,基于这个类可以实现增删改查的功能 class wenjuan(models.Model): """ 问卷 """ name=models.CharField(u'问卷名称',max_length=128) breif

动态代理之JDK Proxy浅析

反射:运行时动态实例化任何一个类. 看此文章前至少对JAVA反射有一定了解... Jdk动态代理的实现就是使用了反射机制,关键代码在Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h).可以看到该方法中的最后一个参数InvocationHandler,这是动态代理实现的另一个关键点. 直接上代码,接口.目标类.调用处理类: /** * @author longe * 目标类实现的