django 1.8文档代码
2016-11-15 20:35
253 查看
抽象基类
from django.db import models class CommonInfo(models.Model): name = models.CharField(max_length=100) age = models.PositiveIntegerField() class Meta: abstract = True class Student(CommonInfo): home_group = models.CharField(max_length=5)
CommonInfo 模型无法像一般的Django模型一样使用,因为它是一个抽象基类。它无法生成一张数据表或者拥有一个管理器,并且不能实例化或者直接储存。
元 继承
from django.db import models class CommonInfo(models.Model): # ... class Meta: abstract = True ordering = ['name'] class Student(CommonInfo): # ... class Meta(CommonInfo.Meta): db_table = 'student_info'
Django 会对抽象基类的 Meta类做一个调整:在设置 Meta属性之前,Django 会设置 abstract=False。这意味着抽象基类的子类本身不会自动变成抽象类。 当然,你可以让一个抽象基类继承自另一个抽象基类,你只要记得每次都要显式地设置 abstract=True。
小心使用 related_name
例如,假设有一个app叫做common/models.py:from django.db import models class Base(models.Model): m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related") class Meta: abstract = True class ChildA(Base): pass class ChildB(Base): pass
以及另一个应用 rare/models.py:
from common.models import Base class ChildB(Base): pass
ChildA.m2m 字段的反向名称是 common_childa_related,而 ChildB.m2m 字段的反向名称是 rare_childb_related。这取决于你如何使用 ‘%(class)s’ 和’%(app_label)s来构造你的反向名称。如果你没有这样做,Django 就会在验证 model (或运行 migrate) 时抛出错误。
多表继承
代理继承
代理继承要做的:为原始模型创建一个代理 。你可以创建,删除,更新代理 model 的实例,而且所有的数据都可以像使用原始 model 一样被保存。 不同之处在于:你可以在代理 model 中改变默认的排序设置和默认的 manager ,更不会对原始 model 产生影响。from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class MyPerson(Person): class Meta: proxy = True def do_something(self): # ... pass
person类和它的父类 Person 操作同一个数据表。特别的是,Person 的任何实例也可以通过 MyPerson访问,反之亦然:
>>> p = Person.objects.create(first_name="foobar") >>> MyPerson.objects.get(first_name="foobar") <MyPerson: foobar>
你也可以使用代理 model 给 model 定义不同的默认排序设置。 你可能并不想每次都给Person模型排序,但是使用代理的时候总是按照last_name属性排序。这非常容易:
class OrderedPerson(Person): class Meta: ordering = ["last_name"] proxy = True
相关文章推荐
- django 1.8文档代码
- Django1.8文档翻译-Form-Overview
- django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)
- django 1.8 官方文档翻译: 3-1-4 视图装饰器
- django 1.8 官方文档翻译: 6-6-1 部署 Django
- django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令
- Django1.8文档阅读手记
- django 1.8 官方文档翻译: 1-1-1 Django初探
- django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
- django 1.8 官方文档翻译: 3-4-1 基于类的视图
- django 1.8 官方文档翻译: 6-6-4 部署静态文件
- django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)
- django 1.8 官方文档翻译: 2-6-3 提供初始数据
- django 1.8 官方文档翻译: 3-1-2 编写视图
- django 1.8 官方文档翻译: 3-2-1 内建的视图
- django 1.8 官方文档翻译: 2-1-1 模型语法(初稿)
- django 1.8 官方文档翻译: 2-4-4 编写迁移
- django 1.8 官方文档翻译: 2-6-4 数据库访问优化
- django 1.8 官方文档翻译: 3-1-3 Django 的快捷函数
- django 1.8 官方文档翻译: 2-2-1 执行查询