您的位置:首页 > 编程语言

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