Django实用技巧--Models

本文详细介绍了Django中Models的使用,包括数据类型选择、CRUD操作、F查询和Q查询的运用,以及如何进行关系映射和原生的数据库交互,是Django开发者的实用参考资料。

1.数据类型

CharField()         -   varchar(允许自定义长度)
        字符串
URLField()          -   varchar(长度默认为200)
        字符串
 BooleanField()      -   tinyint
     True or False           0 or 1
 DateField()         -   data
     data数据类型
 DateTimeField()     -   datatime
 	datetime数据类型
 Decimalfield(max_digits=7, decimal_places=2)      -   decimal(7.,2)
     数字
 FloatField()        -   float
     小数
 IntegerField()      -   int
     数字
 EmailField()        -   varchar
     字符串
 ImageField()        -   varchar
     存储图片的路径

字段选项:
    null = False;           指定当前字段是否为空,默认为false
    default = 默认值         指定当前字段的默认值,默认允许为空
    db_column = 列名         指定当前字段的列名,如果不指定的话则采用当前属性名作为列名
    max_length = 30  指定字符长度
    db_index                为当前字段创建索引
    verbose_name            为当前字段指定后台显示的别名

2.CRUD

一、增加数据:
    1.使用 Entry.objects.create(属性=值,属性=值)
        Entry:可以表示任意的实体类
        返回值:将创建好的实体对象进行返回
    2.创建Entry对象,并通过对象.save()进行保存
        obj = Entry(属性=值,属性=值)
        obj.属性=值
        obj.save()
        obj保存成功后,会被重新赋值
    3.使用字典创建对象,并通过save()保存
        dic = {
            '属性':'值',
            '属性':'值',
            ...
        }
        obj = Entry(**dic)
        obj.save()
二、查询数据
    通过 Entry.objects 属性调用查询结果
    所有的查询接口的后面,都可以通过一个query属性来或得到对应的sql语句
    1.基本的查询操作
        语法:all()
        用法:Entry.objects.all()
        返回:QuerySet,由对象组成列表
    2.查询返回指定列:
        语法:values() | value('列1', '列2', ...)
        用法:
            Entry.objects.values()
            Entry.objects.all().values()
        返回值QuerySet,会将查询出来的部分列封装到字典中,再封装到列表中
    3.查询返回指定列
        语法:values_list('列1', '列2', ...)
        用法同上
        返回值:QuerySet,会将查询出来的部分列封装到元祖中,再封装到列表中
    4.值查询一条数据
        语法:get(条件)
        作用:查询只能返回一条数据
        用法:Entry.Objects.get('条件')
        注意:
            该方法只能返回一条数据
            查询结果多于一条或没有查询结果的话都会抛出异常
    5.根据条件查询部分行数据
        语法:filter(条件)
        用法: Entry.objects.filter()
        返回值:QuerySet
            Book.object.filter(id=1)[0]
            Book.object.filter(id=1, publicate_date='2015-10-12')   and
    6.查询谓词
        Entry.objects.filter(属性__谓词=值)
        1.比较:
           id__gt=4                 id > 4
           id__lte=4                id <=4
        2.模糊查询:
            name__contains='Lennon   name LIKE '%Lennon%';
            headline__startswith='Lennon'       headline LIKE 'Lennon%'
            headline__endswith='Lennon'         headline LIKE '%Lennon'
        3.包含
            id__in=[1, 3, 4]     id  IN (1, 3, 4)
            pub_date__range=(start_date, end_date)   pub_date BETWEEN '2005-01-01' and '2005-03-31';
        4.时间
            data
            quarter
            year
                    Entry.objects.filter(pub_date__year__gte=2005)
            time
            hour
        5.空
            pub_date__isnull=True   pub_date IS NULL;
    7.做不等条件的查询筛选
        语法:exclude(条件)
        用法:Entry.objects.exclude()
        返回值:QuerySet
    8.排序查询
        语法:order_by()
        用法:Entry.objects.order_by('列', '-列')
            默认是升序排序,如果想要降序则在列名前添加 - 即可
    9.聚合查询 - 不带分组
        语法:aggregate()
        用法:Entry.objects.aggregate(名=聚合函数('列'))
        返回值:字典组成的列表
            聚合函数:
                1.Avg()
                2.Sum()
                3.Count()
                4.Min()
                5.Max()

    10.聚合查询 - 带分组
        语法:annotate()
        用法:Entry.objects.filter(条件1).values('分组列').annotate=(查询列名=聚合函数).
                                            分组列名
        filter(条件2).values('查询列')
                      要查询的字段
            num = Book.objects.values('publicate_date').annotate(count=Count('id')).
            values('publicate_date', 'count').all()

三、删除和修改
    1.修改:
        1.查
            得到查询实体对象 QuerySet
        2.改
            通过对象的属性修改对象的值
        3.保存
            实体对象:调用 save()
            QuerySet的update(属性=值,属性=值, ...)能够实现批量修改
            QuerySet.update(...)
    2.删除
        1.删除单个单元
            au = Author.objects.get(id=1)
            au.delete()
        2.批量删除对象
            list = Author.objects.all()
            list.delete()
        isActive = True

3.F查询和Q查询

1.F查询:
    Author表中所有人的年龄加10岁
        update index_author set age= age + 10 where ...
    1.作用:
        在执行过程中获取某列的值
    2.语法规范:
        from django.db.models import F
        Author.objects.all().update(age=F('age') + 10)
2.Q查询
    1.作用:
        在条件中充当或的实现方式(or)
    2.语法规范
        from django.db.models.import Q
        Author.objects.filter(Q(条件1)|Q(条件2))

4.关系映射

1.一对一映射
    1.语法
        关联的两个类中的任意一个类中
            属性=models.OneToOneField(Entry)
        class Book
            author = models.OneToOneField(Author)
        在数据库中
            生成一个外键列(author_id)在数据表Book中
            在Author中,生成一个隐式属性 -book ,用来表示Author 定义的book
    2.查询
        1.正向查询
            author = Book.objects.get(id=1).author (直接返回对象)
        2.反向查询:通过隐式属性查找
            book = Author.objects.get(id=1).book   (直接返回对象)

2.一对多映射
    1.语法:
        在"多"的实体类中,增加对"一"的实体类的引用
        出版社(Publisher)对书籍(Book)是一(Publisher)对多(Book)
        publisher = models.ForeignKey(Publisher)
        在数据库中:
            在表Book中生成一个外键列(publisher_id)
            在表Publisher中增加一个隐式属性 -book_set,表示的是对Book的一个查询
    2.查询:
        1.正向查询
            publisher = Book.objects.get(id=3).publisher   (直接返回对象)
        2.反向查询
            books = Publish.objects.get(id=1).book_set.all()    (返回对象列表)

3.多对多映射
    1.语法:
        在关联的两个类的任意一个类增加
            属性= models.ManyToMany/field(Entry)
            author_set = Book.ManyToManyField(Author)
        在数据库
            创建第三张表 ,字段author_id, publisher_id

    2.查询:
        1.正向查询
            authors = Book.objects.get(id=).author_set.all()   (返回对象列表)
        2.反向查询
            books = Author.objects.get(id=1).book_set.all()    (返回对象列表)

5.原生的数据库操作方法

 1.查询
     函数:raw(sql)
     语法:Entry.objects.raw(sql)
     返回:QuerySet'
 2.增删改
     from django.db import connection
     def doSQL(request):
         with connection.cursor() as cursor
             sql = 'xxx'
             cursor.excute(sql)
         return ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值