Django入门到放弃之ORM单表操作

简介: Django入门到放弃之ORM单表操作

1.常用和非常用字段和参数概览

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

# 常用字段

    -IntegerField   整数

    -AutoField

    -BooleanField

    -CharField

    -DateField

    -DateTimeField

    -DecimalField

    -FileField   上传文件,本质是varchar

    -ImageField   图片,本质是varchar,继承了FileField

    -TextField   存大文本

    -EmailField   本质是varchar

# 非常用字段

    -BigAutoField

    -SmallIntegerField  

    -PositiveSmallIntegerField

    -PositiveIntegerField

    -BigIntegerField

    

    

            'AutoField''integer AUTO_INCREMENT',

            'BigAutoField''bigint AUTO_INCREMENT',

            'BinaryField''longblob',

            'BooleanField''bool',

            'CharField''varchar(%(max_length)s)',

            'CommaSeparatedIntegerField''varchar(%(max_length)s)',

            'DateField''date',

            'DateTimeField''datetime',

            'DecimalField''numeric(%(max_digits)s, %(decimal_places)s)',

            'DurationField''bigint',

            'FileField''varchar(%(max_length)s)',

            'FilePathField''varchar(%(max_length)s)',

            'FloatField''double precision',

            'IntegerField''integer',

            'BigIntegerField''bigint',

            'IPAddressField''char(15)',

            'GenericIPAddressField''char(39)',

            'NullBooleanField''bool',

            'OneToOneField''integer',

            'PositiveIntegerField''integer UNSIGNED',

            'PositiveSmallIntegerField''smallint UNSIGNED',

            'SlugField''varchar(%(max_length)s)',

            'SmallIntegerField''smallint',

            'TextField''longtext',

            'TimeField''time',

            'UUIDField''char(32)',

                

# 常用参数

    -null

    -max_length

    -default

    -primary_key

    -unique

    -db_index

    

    #

    -choices:比较常用(后面再说)

    -blank: django admin里提交数据是否可以为空

    -verbose_name:在字段中则自定义字段在admin后台显示的内容,在meta中则定义表在admin后台显示的内容

    -help_text: 字段的帮助信息

       

元数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# 元数据

    -必须记住的

    class Meta:

            # 表名

        db_table = "book"

        ordering=('id', )    #使用id作为排序字段 ordering=('-id', ) -表示降序  因为orm获取数据有limit 21限制,在分页器时需要指定

        #联合索引

        index_together = [

            ("name""publish"),

        ]

        # 联合唯一索引

        unique_together = (("name""publish"),)

        

   -了解

        # admin中显示的表名称

        verbose_name='图书表'

        #verbose_name加s

        verbose_name_plural='图书表'

        #字段显示中文

        title = models.CharField(max_length=32,verbose_name="标题")

3.打印原生sql

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

settings配置文件添加以下配置

LOGGING = {

    'version'1,

    'disable_existing_loggers'False,

    'handlers': {

        'console':{

            'level':'DEBUG',

            'class':'logging.StreamHandler',

        },

    },

    'loggers': {

        'django.db.backends': {

            'handlers': ['console'],

            'propagate'True,

            'level':'DEBUG',

        },

    }

}

4.增

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

创建记录方式1

    student_obj = models.Student(

        name='dazhaung',

        age=23,

    )

    student_obj.save()

    

创建记录方式2

    new_obj = models.Student.objects.create(name='xiaozhuang2',age=6#写成 **{'name':'xx'}

    print(new_obj)  #Student object --  model对象

    print(new_obj.name)  #点属性,可以获取对应字段的数据

    print(new_obj.age)

 

 

创建方式3 批量创建

    objs_list = []

    for in range(100,3000000):

        obj = models.Student(

            name='xiangxixxx',

            age = 10,

        )

        objs_list.append(obj)

 

    models.Student.objects.bulk_create(objs_list,100#每次插入100条

 

创建方法4 update_or_create 有就更新,没有就创建

    models.Student.objects.update_or_create(

        name='红旭妹妹2',

        defaults={

            'age':38,

        }

    )

 

添加日期数据

    import datetime

    current_date = datetime.datetime.now()

    # print(current_date) #2019-07-19 12:19:26.385654

    # 两种方式

    # models.Brithday.objects.create(name='B哥',date=current_date)

    # models.Brithday.objects.create(name='得港10',date='2000-12-08')

   

5.删

1

2

3

4

5

6

7

8

# 删除的两种方式

# 第一种:queryset的delete方法

# res=models.Book.objects.all().delete()

# print(res)

# 第二种:对象自己的delete方法

# book = models.Book.objects.all().filter(name='金x梅').first()

# print(type(book))

# res=book.delete()

6.改

1

2

3

4

5

6

7

8

9

更新 update方法 model对象不能调用更新方法 报错信息'Student' object has no attribute 'update'只能queryset调用,如

 # 第一种:queryset的update方法

    models.Student.objects.get(name='红旭妹妹').update(age=38)

    models.Student.objects.filter(name='红旭妹妹').update(age=38)

 # 第二种:对象自己的,直接赋值

    book = models.Book.objects.filter(name='xxx').last()

    book.name='asdfasd'

    book.save()

   

7.简单查

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

查询所有的数据  .all方法 返回的是queryset集合

    all_objs = models.Student.objects.all()

    #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 类似于列表  --  queryset集合

    # for i in all_objs:

    #     print(i.name)

    print(all_objs)

 

条件查询  .filter方法,返回的也是queryset集合,查询不到内容,不会 报错,返回一个<QuerySet []>空的queryset

    objs = models.Student.objects.filter(id=2)  #找id为2的那条记录

    print(objs) #<QuerySet [<Student: xiaozhuang>]>

    objs = models.Student.objects.filter(name='dazhaung')

    print(objs) #<QuerySet [<Student: dazhaung>]>

 

条件查询 get方法,返回的是model对象,而且get方法有且必须只有1个结果

    obj = models.Student.objects.get(id=3)  #找id为3的那条记录

    print(obj)  #xiaozhuang2

8.查询接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<1all():                  查询所有结果,结果是queryset类型

  

<2filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,结果也是queryset类型 Book.objects.filter(title='linux',price=100#里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的

    models.Student.objects.filter(id=7,name='大壮哥哥',age=78).update(

        name='大壮禅师',

        age=78

    )

    #打伞形式传参

    models.Student.objects.filter(**{'id':7,'name':'大壮禅师'}).update(age=100)

    models.Student.objects.all().filter(id=7)  queryset类型可以调用fitler在过滤

  

<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,

                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。  Book.objects.get(id=1)

  

<4> exclude(**kwargs):      排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型 Book.objects.exclude(id=6),返回id不等于6的所有的对象,或者在queryset基础上调用,Book.objects.all().exclude(id=6)

    # exclude(**kwargs): 排除,objects控制器和queryset集合都可以调用,返回结果是queryset类型

    # query = models.Student.objects.exclude(id=1)

    # print(query)

    # query = models.Student.objects.filter(age=38).exclude(id=6)

    # print(query)

                 

<5> order_by(*field):       queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型

                  models.Book.objects.all().order_by('price','id'#直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了order_by('-price'),order_by('price','id')是多条件排序,按照price进行升序,price相同的数据,按照id进行升序

        

        

<6> reverse():              queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型

            # 排序之后反转

            # query = models.Student.objects.all().order_by('id').reverse()

            # print(query)

 

<7> count():                queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。

  

<8> first():                queryset类型的数据来调用,返回第一条记录 Book.objects.all()[0= Book.objects.all().first(),得到的都是model对象,不是queryset

  

<9> last():                queryset类型的数据来调用,返回最后一条记录,结果为model对象类型

  

<10> exists():              queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False

                   空的queryset类型数据也有布尔值TrueFalse,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits

                 例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据

 

<11> values(*field):        用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列

                            model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。

<12> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

 

<13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,结果还是queryset

    query = models.Student.objects.all().values('age').distinct()

    print(query)

   

9.基于双下划线的模糊查询

1

2

3

4

5

6

7

8

9

10

11

12

Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象

Book.objects.filter(price__gt=100)  #大于,大于等于是price__gte=100,别写price>100,这种参数不支持

Book.objects.filter(price__lt=100)

Book.objects.filter(price__range=[100,200])  #sql的between and,大于等于100,小于等于200

Book.objects.filter(title__contains="python")  #title值中包含python的

Book.objects.filter(title__icontains="python"#不区分大小写

Book.objects.filter(title__startswith="py"#以什么开头,istartswith  不区分大小写

Book.objects.filter(pub_date__year=2012)

 

# all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有书籍

# all_books = models.Book.objects.filter(pub_date__year__gt=2012)#找大于2012年的所有书籍

all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2)#找2019年月份的所有书籍,如果明明有结果,你却查不出结果,是因为mysql数据库的时区和咱们django的时区不同导致的,了解一下就行了,你需要做的就是将django中的settings配置文件里面的USE_TZ = True改为False,就可以查到结果了,以后这个值就改为False,而且就是因为咱们用的mysql数据库才会有这个问题,其他数据库没有这个问题。

10.python脚本中调用django环境

1

2

3

4

5

6

7

8

9

10

11

# 在脚本中调用djagno服务 不启动Django就可以执行表模型增删改查操作 celery中可以使用

import os

if __name__ == '__main__':

    #1  引入django配置文件

    os.environ.setdefault('DJANGO_SETTINGS_MODULE''day67.settings')

    # 2 让djagno启动

    import django

    django.setup()

    # 3 使用表模型

    from app01 import models

    models.Book.objects.create(name='测试书籍',publish='xx出版社')


相关文章
|
17天前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
14天前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
10 0
|
17天前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
17天前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制
|
17天前
|
前端开发 数据库 数据安全/隐私保护
Django入门到放弃之Auth模块
Django入门到放弃之Auth模块
|
17天前
|
JSON 前端开发 数据安全/隐私保护
Django入门到放弃之CSRF_TOKEN
Django入门到放弃之CSRF_TOKEN
|
17天前
|
前端开发 中间件 索引
Django入门到放弃之中间件
Django入门到放弃之中间件
|
17天前
|
缓存 数据库 数据安全/隐私保护
Django入门到放弃之session
Django入门到放弃之session
|
17天前
|
JavaScript 前端开发 数据安全/隐私保护
Django入门到放弃之cookies
Django入门到放弃之cookies
|
17天前
|
前端开发 网络协议 数据库
Django入门到放弃之forms组件
Django入门到放弃之forms组件