`
blithewu
  • 浏览: 12024 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

django中 分别获取父类子类 对象

阅读更多
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>]
分享到:
评论

相关推荐

    MethodScope,:dango:reduce重复继承使用@methodscope在oop世界中工作。.zip

    在Python中,继承是一种强大的机制,允许一个类(子类)获取另一个类(父类)的所有属性和方法。然而,当多个子类需要从相同的基类继承并实现特定功能时,重复的继承结构可能会变得复杂且难以维护。MethodScope项目...

    最常见的35个Python面试题及答案.docx

    继承是面向对象编程的一个关键特性,允许一个类(子类)继承另一个类(父类)的属性和方法。Python支持单继承、多重继承、多级继承、分层继承和混合继承等多种形式。 7. **Flask框架** Flask是一个轻量级的Web...

    学python的总结(1).docx

    继承使得子类可以继承父类的特性,多态则允许不同类的对象以相同的方式进行交互,提高了代码的灵活性和可扩展性。 Python还提供了丰富的标准库,如os模块用于操作系统级别的交互,如管理文件和目录;re模块则提供了...

    27篇精选python文章

    在面向对象编程中,子类继承父类时,有时需要在子类的构造函数中调用父类的构造函数,以初始化继承来的属性。这通常通过`super()`函数实现: ```python class Parent: def __init__(self): print("Parent ...

    1.Object_Project.rar

    类是创建对象的模板,对象是类的实例,继承允许子类继承父类的属性和方法,封装是将数据和操作隐藏在对象内部,多态则确保不同对象可以响应相同的消息。 2. **设计模式**:如工厂模式、单例模式、观察者模式等,...

    27篇python小片段文章.pdf

    在Python中,子类可以通过使用super()函数调用父类的构造函数。在Python 3中,推荐使用super()函数,而Python 2中则常使用父类名直接调用。 5. 循环和递归实现二分法查找: 二分查找是一种效率较高的查找算法,其...

    Mastering-Python.pdf.pdf

    - **多态**:允许子类重写父类的方法,使得不同类型的对象能够响应相同的接口。 ##### 2. 异常处理 - **作用**:在程序运行过程中捕获和处理错误情况,防止程序崩溃。 - **基本语法**: ```python try: # 可能...

    使用Python的web.py框架实现类似Django的ORM查询的教程

    在Python的世界里,ORM(Object-Relational Mapping)是一种技术,它允许开发者使用面向对象的方式来操作数据库,将数据库中的数据映射成Python对象,而无需编写SQL语句。Django框架内置的ORM系统非常强大,提供了...

    《Python编程快速上手》-代码

    - **继承与多态**:通过继承扩展已有类的功能,多态允许子类对象替代父类对象。 - **封装与抽象**:通过访问修饰符控制成员的访问权限,实现数据封装;抽象类定义公共接口。 6. **高级特性** - **装饰器**:装饰...

    Python编程实践gwpy2-code

    - 封装与多态:通过访问修饰符实现封装,多态性体现在子类对象可以替换父类对象。 3. **标准库与第三方库** - 标准库:如`sys`用于系统交互,`os`进行操作系统接口操作,`time`处理时间,`random`生成随机数,`re...

    Python研究(Dive Into Python)

    - 继承与多态:通过继承,子类可以复用父类的属性和方法,多态则允许不同类型的对象对同一消息作出响应。 - 封装与抽象:通过类的封装,可以隐藏内部实现细节,提高代码安全性;抽象则强调接口而非实现,便于设计...

    pytHOn文件,详细介绍了很多重要语法内容

    继承(inheritance)允许子类继承父类的属性和方法,多态(polymorphism)确保代码对不同对象的通用性。 7. **迭代器与生成器** 迭代器是实现了`__iter__()`和`__next__()`方法的对象,可以被`for`循环遍历。生成...

    OOP-2021

    - **继承**:继承允许创建新的类(子类)从已有的类(父类)中获取特性,减少了代码重复,增强了代码的可重用性。 - **多态**:多态是指同一种行为在不同对象上可以有不同的表现形式,允许子类重写父类的方法,实现...

    python入门级教程学习笔记 python3版本,文件内的程序均可运行.rar

    3. 继承:子类继承父类,实现代码复用。 4. 多态:不同对象对同一方法的不同实现。 六、异常处理 1. try/except:用于捕获并处理程序运行时可能出现的错误。 2. finally:无论是否发生异常,finally中的代码都会被...

    Python Language

    - **继承**:子类可以继承父类的属性和方法,实现代码复用。 - **多态**:不同类的对象可以调用相同的接口,实现多态性。 - **封装**:使用私有属性和方法(__name__)来保护内部状态。 5. **高级特性**: - **...

    《Python 编程从入门到实践》学习笔记整理.zip

    - 继承:如何创建子类并继承父类的方法和属性。 - 多态:理解多态的概念及其在Python中的实现。 - 封装与抽象:封装数据和行为,理解抽象类和接口的概念。 3. 数据处理: - Numpy库:学习使用Numpy进行数值计算...

    计算机编程导论——Python程序设计-PPT课件

    - 多态:子类对象可以替代父类对象,实现不同类之间的共性处理。 ### 8. 异常处理 - `try...except`结构用于捕获并处理异常。 - 使用`finally`确保某些代码无论是否发生异常都会执行。 - `raise`语句可以主动抛出...

    python学习导航.txt

    - 继承是面向对象编程的特性之一,允许创建一个类(子类)来继承另一个类(父类)的属性和方法。 - 多态指的是同一操作作用于不同的对象,可以有不同的解释和不同的执行结果。 - 封装是指隐藏对象的属性和实现细节,...

    Python语言之安装和基础知识以及核心概念

    继承(inheritance)允许一个类(子类)从另一个类(父类)获取属性和方法,实现代码重用。多态(polymorphism)则意味着子类可以覆盖或扩展父类的方法,提供不同的行为。 Python的核心概念还包括模块(module)...

    Python学习笔记

    2. 继承:子类继承父类的属性和方法,实现代码复用。 3. 多态:不同对象对同一消息可以有不同的响应,体现多态性。 **六、异常处理** Python通过`try-except`语句进行异常处理,提高程序的健壮性。 **七、标准库与...

Global site tag (gtag.js) - Google Analytics