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