django面向对象ORM

Django ORM对模型继承的支持,将python面向对象的编程方法与数据库面向关系表的数据结构结合的很巧妙。支持三种风格的模型继承。

1.抽象类继承:父类继承自models.Model,但不会在底层数据库中生成相应的数据表,父类的属性列存储在其子类的数据表中。

2.多表继承:多表继承的每个模型类都在底层数据库中生成相应的数据表管理数据。

3.代理模型继承:父类用于在底层数据库中管理数据表,而子类不定义数据列,只定义查询数据表的排序方式等元数据。

1.抽象基类继承举例如下:

from django.db import models

class Message(models.Model):
    id        = models.AutoField(default=0)
    content   = models.CharField(max_length=100)
    user_name = models.CharField(max_length=80)
    pub_date  = models.DateField()

    class Meta:
        abstract = True #证明该类是抽象基类



class Moment(Message):
    headline = models.CharField(max_length=50)



LEVELS = (
    ('1', 'Very Good'),
    ('2', 'Good'),
    ('3', 'Normal'),
    ('4', 'Bad'),
)

class Coment(Message):
    level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

抽象基类Message,用于保存消息的四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承Message,并且分别定义独有的一个地段。三个类映射到数据库,会被定义为两个数据表(抽象基类不在底层数据库中声称数据表):

数据表:app_Moment:app代表应用,包括id、user_name、content、pub_date和headline五个字段

数据表:app_Coment: 包括包括id、user_name、content、pub_date和level五个字段

2.多表继承

from django.db import models

class Message(models.Model):
    id        = models.AutoField(default=0)
    content   = models.CharField(max_length=100)
    user_name = models.CharField(max_length=80)
    pub_date  = models.DateField()


class Moment(Message):
    headline = models.CharField(max_length=50)



LEVELS = (
    ('1', 'Very Good'),
    ('2', 'Good'),
    ('3', 'Normal'),
    ('4', 'Bad'),
)

class Coment(Message):
    level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

类Message,用于保存消息的四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承Message,并且分别定义独有的一个字段。三个类映射到数据库,会被定义为三个数据表:

数据表:app_Moment:app代表应用,包括id、user_name、content、pub_date和headline五个字段 

数据表:app_Coment: 包括包括id、user_name、content、pub_date和level五个字段

数据表:app_Message:包括包括id、user_name、content、pub_date四个字段

多表继承时,在子类实例中可以通过小写的父类名字引用父类的实力

e.g:al = Moment(xx, user_name="test")
    
    print(al.message.user_name) -------> test

3.代理模型继承

前两种继承模型中子类都有实际存储数据的作用,而代理模型继承父类的数据而不存储实际的数据,代理模型继承通过在子类的Meta类中定义proxy=True属性来实现:

from django.db import models

class Mement(models. Model):
    id        = models.AutoField(default=0)
    content   = models.CharField(max_length=100)
    user_name = models.CharField(max_length=80)
    pub_date  = models.DateField()


class OrderByMoment(Moment):  #使用代理模型继承的原因是子类中新的特性不会影响父类的模型及其已有代码的行为
    class Meta:
        proxy    = True
        ordering = ['-pub_date']   #Moment根据pub_date倒序排列 
    

Moment类用于存储数据,OrderByMoment类用于管理根据pub_date倒序排列的Moment

猜你喜欢

转载自blog.csdn.net/weixin_42694291/article/details/85787987