Django框架文件解析--models.py

models

from django.db import models


'''
从django.db中导入 models 模型,
意味着, 可以直接在应用中的models这个当前文件中设计
该应用在数据库中的模型.

每一个models在数据库内对应一个数据库
每一个类,对应一个表
类中的函数, 则影响表中的数据个数以及类型.

设计模型的时候, 直接在models里面书写类即可
所有的模型都需要继承django.db中的models中的Model类,注意大写开头.Model是models的一个类.

'''

# Create your models here.

'''
    在使用manage的shell功能的时候, 
    想要在shell中通过模型类操作数据库中的数据.
    首先就要导入该 应用的modes中的具体的哪个模型类.
    然后使用模型类定义实例对象, 最后通过实例对象操作.
    
    可以对实例对象中, 模型类中的具体属性, 进行赋值 操作.
    操作之后, 需要使用实例对象的.save()方法, 保存入数据库, 才能使之生效.
    
    只有实例对象的能够通过save方法保存数据.
    如果通过 
    变量 = BookInfo.objects.get(id=1) 
    获取的就是实例对象, 但是无法直接通过save()保存, 
    因为获取的id也同样,和之前的实例对象的id相同
    改变id后,可以save().
    
    !!!!之后的存储项目,不会自动跳过该id,导致多个id共存. 
    之后读取id的时候,是后添加的数据
    
>>> from booktest.models import BookInfo
>>> 
'''

# 自定义manager模块一般有两个用处, 1修改选择集. 2增加自定义模块简化操作.
class BookInfoManager(models.Manager):
    '''图书模型管理类'''


    # 1修改已有选择集, 完成对isDelete的筛选.
    def all(self):

        books = super().all()
        books = books.filter(is_delete=False)
        return books

    # 2创建新的方法, 简化objects操作.

    def create_book(self,btitle,bpublish):

        # 1. 创建图书对象

        # 为了避免BookInfo改变类名, 从而导致自定义方法无法索引,
        # 此处使用self.model同样可以索引到引用此Manager方法的模型类.
        # 这样, 不管元类如何改变, 方法名称都不用发生变化.
        model_class = self.model

        # book = BookInfo()

        book = model_class()


        # 2. 为图书对象赋值
        book.btitle = btitle
        book.bpublish = bpublish

        # 3. 保存数据
        book.save()

        # 4. 返回对象
        return book






# 单类
class BookInfo(models.Model):

    btitle = models.CharField(max_length = 20)
    # models类中, 不止有创建模型的Model函数, 还有模型需要使用的各种数据.
    bpublish = models.DateField()

    # 关联自定义的Manager
    objects = BookInfoManager()
    # 自定义manager之后,一定要在模型类模块内关联. 否则无法产生联系.


    # 在模型类内部完成新建函数的写法, 但一般写在模型类外部.
        # 1.定义类方法.
        # 2.需要继承cls类本身


    # @classmethod
    # def create_book(cls,btitle,bpublish):
    #     obj = cls()
    #     obj.btitle = btitle
    #     obj.bpublish = bpublish
    #     obj.save()
    #
    #     return obj

    # 为防止应用名称发生变化, 则应该定义元类Meta制定数据库表名.

    class Meta:
        db_table = "booktest"
        # 指定模型类对应的表名之后,
        # 不管应用名称如何发声变化,
        # 都能关联到该数据表.





# 多类
class HeroInfo(models.Model):
    # 姓名
    hname = models.CharField(max_length = 20)

    # 性别  boolean 就是布尔类型
    # hgender = models.BooleanField(defalut = False)  拼写错误
    hgender = models.BooleanField(default = False)

    # 备注  武功
    hcomment = models.CharField(max_length = 128)

    hbook = models.ForeignKey('BookInfo')
    # 关系属性中, 建立和BookInfo的关系.图书和英雄一对多的关系(外键).

    '''
    关系属性
    
    在一对多的关系数据表的时候对应关系的时候,
    对应关系需要通过(多)来填写关联关系.
    '''




'''
    所关联的表, 也是一个单独的object对象, 
    在使用hero对象调用关联对象的时候, 直接可以后缀,相关联对象的属性.
    例如:
        >>> h3.hname
        '段誉'
        >>> h3.hbook
        <BookInfo: BookInfo object>
        >>> h3.hbook.btitle
        '天龙八部'


'''

 

posted @ 2019-09-09 15:41  Jrri  阅读(1041)  评论(0编辑  收藏  举报