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 '天龙八部' '''