from django.db import models
from django.db.models.query import QuerySet
class ChildQuerySet(QuerySet):
def iterator(self):
for obj in super(ChildQuerySet, self).iterator():
yield obj.get_child_object()
class ChildManager(models.Manager):
def get_query_set(self):
return ChildQuerySet(self.model)
class ParentModel(models.Model):
_child_name = models.CharField(max_length=100, editable=False)
class Meta:
abstract = True
def save(self, *args, **kwargs):
self._child_name = self.get_child_name()
super(ParentModel, self).save(*args, **kwargs)
def get_child_name(self):
if type(self) is self.get_parent_model():
return self._child_name
return self.get_parent_link().related_query_name()
def get_child_object(self):
return getattr(self, self.get_child_name())
def get_parent_link(self):
return self._meta.parents[self.get_parent_model()]
def get_parent_model(self):
raise NotImplementedError
def get_parent_object(self):
return getattr(self, self.get_parent_link().name)
用法:
class Post(ParentModel):
title = models.CharField(max_length=50)
objects = models.Manager()
children = ChildManager()
def __unicode__(self):
return self.title
def get_parent_model(self):
return Post
class Article(Post):
text = models.TextField()
class Photo(Post):
image = models.ImageField(upload_to='photos/')
class Link(Post):
url = models.URLField()
输出:
>>> Post.objects.all()
[<Post: Django>, <Post: Make a Tumblelog>, <Post: Self Portrait>]
>>> Post.children.all()
[<Link: Django>, <Article: Make a Tumblelog>, <Photo: Self Portrait>]
分享到:
相关推荐
在Python中,继承是一种强大的机制,允许一个类(子类)获取另一个类(父类)的所有属性和方法。然而,当多个子类需要从相同的基类继承并实现特定功能时,重复的继承结构可能会变得复杂且难以维护。MethodScope项目...
继承是面向对象编程的一个关键特性,允许一个类(子类)继承另一个类(父类)的属性和方法。Python支持单继承、多重继承、多级继承、分层继承和混合继承等多种形式。 7. **Flask框架** Flask是一个轻量级的Web...
继承使得子类可以继承父类的特性,多态则允许不同类的对象以相同的方式进行交互,提高了代码的灵活性和可扩展性。 Python还提供了丰富的标准库,如os模块用于操作系统级别的交互,如管理文件和目录;re模块则提供了...
在面向对象编程中,子类继承父类时,有时需要在子类的构造函数中调用父类的构造函数,以初始化继承来的属性。这通常通过`super()`函数实现: ```python class Parent: def __init__(self): print("Parent ...
类是创建对象的模板,对象是类的实例,继承允许子类继承父类的属性和方法,封装是将数据和操作隐藏在对象内部,多态则确保不同对象可以响应相同的消息。 2. **设计模式**:如工厂模式、单例模式、观察者模式等,...
在Python中,子类可以通过使用super()函数调用父类的构造函数。在Python 3中,推荐使用super()函数,而Python 2中则常使用父类名直接调用。 5. 循环和递归实现二分法查找: 二分查找是一种效率较高的查找算法,其...
- **多态**:允许子类重写父类的方法,使得不同类型的对象能够响应相同的接口。 ##### 2. 异常处理 - **作用**:在程序运行过程中捕获和处理错误情况,防止程序崩溃。 - **基本语法**: ```python try: # 可能...
在Python的世界里,ORM(Object-Relational Mapping)是一种技术,它允许开发者使用面向对象的方式来操作数据库,将数据库中的数据映射成Python对象,而无需编写SQL语句。Django框架内置的ORM系统非常强大,提供了...
- **继承与多态**:通过继承扩展已有类的功能,多态允许子类对象替代父类对象。 - **封装与抽象**:通过访问修饰符控制成员的访问权限,实现数据封装;抽象类定义公共接口。 6. **高级特性** - **装饰器**:装饰...
- 封装与多态:通过访问修饰符实现封装,多态性体现在子类对象可以替换父类对象。 3. **标准库与第三方库** - 标准库:如`sys`用于系统交互,`os`进行操作系统接口操作,`time`处理时间,`random`生成随机数,`re...
- 继承与多态:通过继承,子类可以复用父类的属性和方法,多态则允许不同类型的对象对同一消息作出响应。 - 封装与抽象:通过类的封装,可以隐藏内部实现细节,提高代码安全性;抽象则强调接口而非实现,便于设计...
继承(inheritance)允许子类继承父类的属性和方法,多态(polymorphism)确保代码对不同对象的通用性。 7. **迭代器与生成器** 迭代器是实现了`__iter__()`和`__next__()`方法的对象,可以被`for`循环遍历。生成...
- **继承**:继承允许创建新的类(子类)从已有的类(父类)中获取特性,减少了代码重复,增强了代码的可重用性。 - **多态**:多态是指同一种行为在不同对象上可以有不同的表现形式,允许子类重写父类的方法,实现...
3. 继承:子类继承父类,实现代码复用。 4. 多态:不同对象对同一方法的不同实现。 六、异常处理 1. try/except:用于捕获并处理程序运行时可能出现的错误。 2. finally:无论是否发生异常,finally中的代码都会被...
- **继承**:子类可以继承父类的属性和方法,实现代码复用。 - **多态**:不同类的对象可以调用相同的接口,实现多态性。 - **封装**:使用私有属性和方法(__name__)来保护内部状态。 5. **高级特性**: - **...
- 继承:如何创建子类并继承父类的方法和属性。 - 多态:理解多态的概念及其在Python中的实现。 - 封装与抽象:封装数据和行为,理解抽象类和接口的概念。 3. 数据处理: - Numpy库:学习使用Numpy进行数值计算...
- 多态:子类对象可以替代父类对象,实现不同类之间的共性处理。 ### 8. 异常处理 - `try...except`结构用于捕获并处理异常。 - 使用`finally`确保某些代码无论是否发生异常都会执行。 - `raise`语句可以主动抛出...
- 继承是面向对象编程的特性之一,允许创建一个类(子类)来继承另一个类(父类)的属性和方法。 - 多态指的是同一操作作用于不同的对象,可以有不同的解释和不同的执行结果。 - 封装是指隐藏对象的属性和实现细节,...
继承(inheritance)允许一个类(子类)从另一个类(父类)获取属性和方法,实现代码重用。多态(polymorphism)则意味着子类可以覆盖或扩展父类的方法,提供不同的行为。 Python的核心概念还包括模块(module)...
2. 继承:子类继承父类的属性和方法,实现代码复用。 3. 多态:不同对象对同一消息可以有不同的响应,体现多态性。 **六、异常处理** Python通过`try-except`语句进行异常处理,提高程序的健壮性。 **七、标准库与...