美文网首页django
模型继承之多表继承

模型继承之多表继承

作者: 陆_志东 | 来源:发表于2018-08-23 23:34 被阅读16次

    这是django支持的第二种继承方式,使用这种方式,因为每个类都是一个完整的model,而不属于抽象基类,所以每个model都有专属的数据表,都可以查询和创建数据表

    这样的继承会默认自动创建一个OneToOneField关系

    例:

    from django.db import models
    
    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中也是有效的,只不过没有保存在数据库中的Restaurant表中。所以下面两个语句都是可以运行的:

    >>> Place.objects.filter(name="Bob's Cafe")
    >>> Restaurant.objects.filter(name="Bob's Cafe")
    

    如果你有一个 Place ,它同时也是一个 Restaurant, 那么你可以使用 model 的小写形式从 Place 对象中获得与其对应的 Restaurant对象:

    >>> p = Place.objects.get(id=12)
    # If p is a Restaurant object, this will give the child class:
    >>> p.restaurant
    <Restaurant: ...>
    
    注意,如果 p 并不是  Restaurant (比如它仅仅只是 Place对象,或者它是其他类的父类),
    那么在引用 p.restaurant就会抛出Restaurant.DoesNotExist 异常。
    

    多表继承中的元类继承

    子类并不能访问父类的Meta类,但是子类可以继承一部分父类的元类,如果子类没有指定 属性get_latest_by或 ordering 属性,它就会从父类中继承这些属性
    如果父类有了排序设置,而你并不想让子类有任何排序设置,你就可以显式地禁用排序:

    class ChildModel(ParentModel):
        # ...
        class Meta:
            # Remove parent's ordering effect
            ordering = []
    

    指定链接父类的字段

    Django 会自动创建一个OneToOneField字段将子类链接至非抽象的父 model 。如果你想指定链接父类的属性名称,你可以创建你自己的OneToOneField字段,并且设置parent_link=True从而使用该字段链接父类。

    相关文章

      网友评论

        本文标题:模型继承之多表继承

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