DjangoMTV知识点总结之模型

模型:
1 模型类的属性类型(对应于数据表的数据类型/字段类型):
    --->CharFields(max_length=字符长度,对应于数据库的字符串,对应于网页控件表单类型为TextInput
    --->TextField,大文本类型,一般超过4000字符时使用,对应表单类型为Textarea
    --->IntegerField:整数
    --->DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数,max_digits位数总数,decimal_places小数点后的数字位数
    --->FloatField:用python的float实例来表示的浮点数
    --->BooleanField:二值字段,对应表单类型为CheckboxInput
    --->NullBooleanField:三值字段
    --->DateField(auto_now=True, auto_now_add=True),TimeField,DateTimeField:日期,时间,日期+时间类型,对应表单控件TextInput
        auto_now参数:对应的属性值,在每次修改数据后保存时,自动更新为最后一次修改时间
        auto_now_add:当对象第一次被创建时自动设置为当前时间
        default:默认值
        三个参数只能同时设置一个,相互排斥
    --->FileField:一个上传文件的字段
    --->ImageField:一个上传图片的字段,继承于FileField,但是会校验数据,确保是正确的图片
    --->关系型:分类:多对一:ForeignKey,定义外键,本表字段是多端,外键表是一端;ManyToManyField,多对多,字段定义在两端;OneToOneField,一对一,字段定义在任意一端
2 字段选项:通过字段选项,可以实现对字段的约束,在创建字段对象时,通过关键字参数指定
    --->null:如果为True,Django将控制以NULL存放到数据库中,默认为FALSE
    --->blank:如果为True,字段允许为空白,默认是false
    --->db_column:数据库中该字段的名称,如果不设置,就使用模板类属性的名称作为字段名
    --->unique:数据表中该数据唯一
    --->primary_key:是否为主键
3 数据访问:一访问多,格式:对象.模型类小写_set
    一访问一,格式:对象.模型类小写
    多访问一的id(不能访问其他属性),格式:对象.外键属性_id
4 元数据:在模型类中定义元类:class Meta:,该类有两个属性,如下:
    --->db_table = '':定义数据表明,默认的数据表名是’项目名_模型类小写‘
    --->ordering = []: 数据表按某列或某几列进行升序['列名']/降序排列['-列名']
5 模型成员:objects,管理器,是django.models.Manager类的对象,作用是与数据库进行交互。当自定义模型类没有指定管理器,则Django为模型创建一个默认的管理器。
    --->自定义模型管理器:在模型类中添加一个Manager类的属性,使用方法和默认的objects一样,指定自定义管理器后,框架不再生成objects
    --->自定义模型管理器类:继承于django.models.Manager,替换Django的Manager类和数据库进行交互,一个模型类可以有多个模型管理器。作用:向管理器类添加其他方法,修改原始返回的查询集。
        --->举例:class StudentsManager(models.Manager):
                    def get_queryset(self):
                        return super(StudentsManager, self).get_queryset().filter(sgender=True)
            类Students中:stuObj2 = StudentsManager()
            当Students.stuObj2.all()时,返回过滤后的结果
6 创建对象:模型类继承于父类models.Model,__init__已经被父类使用,所以自定义模型中无法使用,自定义类也没有对象属性(只有对应于列的类属性)。模型类对象想要保存到数据库,需要在类外部代码中添加对象属性,操作十分不便。
    --->用类方法来创建:在模型类中创建一个create_model_object(*args)的类方法,返回一个模型类对象,参数表和模型类属性对应
        @classmethod
        def create_student(cls, **params):
            return cls( sname    = params['name'   ])
    --->用自定义管理器中的自定义成员方法创建:自定义管理器可以在多个模型类中使用,该方法可以重用对象创建函数
        def create_modelobj(self, **params):
        modelobj = self.model()#创建一个空模型对象,该对象模型会被框架赋值为管理器所在的模型类
        for k, v in params.items():
            setattr(modelobj, 's%s' % k, v)
        return modelobj
7 模型查询:查询集表示从数据库获取的对象集合。查询集可以有多个过滤器。
    --->过滤器;一个函数,基于所给的参数限制查询集结果。查询集等价于select语句,而过滤器就是where条件。
    --->查询集:Manager类中方法get_queryset返回原始查询集,filter等价于where条件,返回过滤后的查询集,所以能链式调用。可以惰性执行,即直到访问查询集中的数据时,才会触发查询和过滤操作。
    --->数据访问触发操作的情况有:循环迭代,序列化,if判断
    --->过滤器函数:返回查询集的就是过滤器。
        --->all:返回所有数据
        --->filter(键:值[,键:值])[.filter(键:值[,键:值])]:返回符合条件的数据
        --->exclude:过滤掉符合条件的数据
        --->order_by():返回排序后的数据
        --->values():返回一个列表,一个元素是一个字典对象,代表一个数据
    --->其他查询函数:
        --->get():返回一个满足条件的对象。如果没有找到符合条件的数据,模型类会抛出异常DoseNotExist。如果找到多条数据,模型类抛出异常MultipleObjectReturned。
        --->count():返回查询集或数据表中的数据个数
        --->first():返回查询集或数据表中的第一条数据
        --->last():返回查询集或数据表中的最后一条数据
        --->exists():判断查询集或数据表中是否有数据
    --->用切片返回查询集中的部分数据,但是下标不能用负数。可以用于查询的分页。
    --->查询集的缓存:每个查询集都包含一缓存,来最小化对数据库的访问。在新建的查询集中,缓存首次为空,第一次对查询集访问数据时,django会将查询出来的数据缓存并返回查询集,之后的查询都是直接使用查询缓存。
    --->字段查询:实现了where语句,作为方法filter(),exclude(),get()的参数
        --->语法:模型类的属性名称__比较运算符=值
            --->比较预算符:exact,判断,查询内容大小写敏感;
                --->contains:是否包含,大小写敏感,例:查询集.filter(sname__contains='白'),查询sname中包含’白‘字的数据
                --->startwith,endwith:以value开头/结尾,大小写敏感,例:查询集.filter(sname__startwith='图'),查询sname以‘图’开头的数据
                --->以上四个前面加上字母‘i',即iexact,icontains,istartwith,iendwith,代表查询时不区分大小写
                --->isnull,isnotnull:值为True或False,是否为空,例:查询集.filter(sname__isnull=True),查询sname为空的数据
                --->in:设定范围,返回范围内的数据,例:查询集.filter(pk__in=[2,4,6]),查询主键在‘2,4,6’中的数据
                --->算数比较:gt,gte,lt,lte,例:查询集.filter(sage__gt = 20),查询年龄大于20的数据
                --->year,month,day,hour,minute,second:日期的各部分,例:查询集.filter(gdate__year=2017),查询年是2017年的数据
                --->关联查询,类似于SQL中的join查询,语法(全小写):主表fliter(关联表模型类名__属性名[__比较运算符])
                    例:grade = Grades.objects.filter(students_sname_contains='白')#查询年级中名字含白的学生在的年级
                --->快捷查询:用pk代表主键,不用直接使用主键列名
        --->外键语法:外键类的属性名_id
        --->聚合函数:aggregate(聚合语句),返回聚合语句执行后的数据
            --->聚合语句:Avg,求君子;Count,计数;Max:求最大;Min,求最小;Sum,累加
            --->例:先导入聚合函数:from django.db.models import Max,Min,Sum,Count,Avg
                使用:maxAge = Students.objects.aggreate(Max('sage'))
        --->F对象:过滤器的方法中的关键字参数,可以使用模型的A属性与B属性进行比较。前面的运算符都是字段和值的比较,这里是两个字段之间的比较。        --->Q对象:过滤器的方法中的关键字参数,filter中逗号分隔的都是And(并且)类型查询,如果要Or(或者)类型查询,需要用Q对象。
            例:先导入F、Q对象:from django.db.models import F
            使用:Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)#F对象也可以进行加减乘除算数、时间运算后,进行字段比较
                  Students.stuObj.filter(Q(pk__gt=2) | Q(sgender__exact=True))#如果只有一个条件,加不加Q效果一样
                  Students.stuObj.filter(~Q(pk__gt=2))#~代表取反

猜你喜欢

转载自blog.csdn.net/blwinner/article/details/82800385