美文网首页
django inheritance

django inheritance

作者: Dream_lover | 来源:发表于2016-12-28 20:20 被阅读0次

    Abstract base classes

    在元数据中设置Meta中设置 abstract=True ,这个model将用于创建任何数据表.当它被作为基类时.他的字段添加进这些子类当中,
    注意:
    1.如果抽象类和基类有相同名称的字段会产生一个异常.
    2.基类不会产生一个数据表或者生成一个管理器,也不能被直接实例化调用.

    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
    

    Meta inheritance
    django允许声明各种meta属性,如果子类没有声明,他将自动继承父类的,也可以继承然后扩展

    class Meta(father_class.Meta):
           db_table = 'child_info'
    

    db_table将意味着所有的子类(那些没有指定自己的Meta)将使用同一数据库,这肯定不会是你想要的。

    Multi-table inheritanceDjango支持的第二种model继承是多表继承,在继承结构中每个model都是独立的。都对应着自己的数据库表,可以进行独立的查询等操作。继承关系实际是子model和每个父model之间的关系(通过自动创建OneToOneField)

    from django.db import model
    class Place(models.Model): 
        name = models.CharField(max_length=50) 
        address = models.CharField(max_length=80)
    class Restaurant(Place): 
        serves_hot_dogs = models.BooleanField(default=False) 
        serves_pizza = models.BooleanField(default=False)
    

    所有Place的字段都可以在Restaurant中使用,虽然数据存放在不同的数据表中

    Proxy models
    当使用多表继承时一个新的数据表model会在每一个子类中创建,这是因为子model需要存储父mdoel不存在的一些数据字段。但有时只需要改变model的操作行为,可能是为了改变默认的管理行为或添加新的方法。

    这时就应该使用代理模式的继承:创建原始model的代理。你可以创建一个用于 create, delete 和 update的代理model,使用代理model的时候数据将会真实保存。这和使用原始model是一样的,所不同的是当你改变model操作时,不需要去更改原始的model。

    代理模式的声明和正常的继承声明方式一样。你只需要在Meta class 中定义proxy为True就可以了。

    相关文章

      网友评论

          本文标题:django inheritance

          本文链接:https://www.haomeiwen.com/subject/cliimttx.html