Django之ORM   1,内容回顾 2. ORM(对象关系映射) 1,今日内容Django之ORM 2,ORM常用字段和参数 3,关系字段 4,OneToOneField 一对一 5, ManyToManyField多对多 ,6, ORM查询操作必知必会13条 7,补充在Python脚本中调用Django环境 8,补充时间应用应

1. 路由系统

urlpatterns = [

url(r'正则表达式', views.xx, {"name": "Egon"}, name="别名"),

]

0. Django会给用户访问的URL路径最后自动加上 '/'

1. 正则表达式部分:

1. 全匹配 --> 写什么就匹配什么

2. 模糊匹配

3. 分组匹配和分组命名匹配 --> 会把捕获到的值当成参数传递给视图函数

4. (delete|list) --> 多选一匹配

2. 视图部分

1. FBV(基于函数的视图)

直接写函数名

2. CBV(基于类的视图)

类名.as_view()

3. 传参数

4. 别名部分

      1. 起命名的好处...

      2. 如何使用别名?

         1. views.py中

          from django.urls import reverse

          reverse("别名")

          reverse("别名", args=("参数1", "参数2"...))

          reverse("别名", kwargs={"k1": "v1", ...})

       2. 模板语言中

          {% url '别名' %}

          {% url '别名' 参数1 参数2 ... %} --> 位置参数和关键字参数都这么传

    3. namespace(命名空间)

      1. 为什么要用namespace

        from django.conf.urls import url, include

        urlpatterns = [

        url(r'正则表达式', include(另外一个urls, namespace="命名空间名")),

          ]

      2. 如何使用

        1. views.py中

        from django.urls import reverse

        reverse("命名空间名:别名")

        reverse("命名空间名:别名", args=("参数1", "参数2"...))

        reverse("命名空间名:别名", kwargs={"k1": "v1", ...})

       2. 模板语言中

          {% url '命名空间名:别名' %}

          {% url '命名空间名:别名' 参数1 参数2 ... %} --> 位置参数和关键字参数都这么传

2. ORM(对象关系映射)

1. 映射的关系

DB ORM

数据表 <--> 类

数据行 <--> 对象

字段 <--> 属性

2. Django项目使用MySQL数据库

  1. 手动创建数据库

  2. 配置数据库的连接信息

    settings.py 配置 DATABASES 这个配置项

  3. 用pymysql代替默认的MySQLdb

  在settings.py同目录下的__init__.py文件中

  import pymysql

  pymysql.install_as_MySQLdb()

  4 . models.py中创建模型(类)

  5. 执行两条命令

    1. python manage.py makemigrations --> 将models.py中的改动登记到小本本上

     2. python manage.py migrate --> 将改动翻译成SQL语句,去数据库执行

3. 数据库的表之间的关系

    

  1. 外键(ForeignKey) --> 一对多(多对一)

  2 . 多对多(ManyToManyField) --> 通过第三张表建立多对多的关系

4. 数据库的操作(增删改查)

  1. 单表操作:

  1. models.类名.objects.all() --> 查所有

  2. models.类名.objects.get(id=1) --> 根据id查单条数据

  3. models.类名.objects.get(id=1).delete() --> 删除单条数据

  4. 修改

  obj = models.类名.objects.get(id=1)

  obj.name = "新名字"

  obj.save()

  5. 新增

  models.类名.objects.create(name="张曌")

2. 外键的操作

  # 书籍

  class Book(models.Model):

  id = models.AutoField(primary_key=True) # 自增的主键

  title = models.CharField(max_length=32) # 书籍名称 varchar(32)

  publisher = models.ForeignKey(to=Publisher) # 外键关联Publisher这张表

   book_obj --> 表示一本书的对象

book_obj.id / book_obj.title

book_obj.publisher --> 和我关联的出版社对象

book_obj.publisher_id --> 和我关联的出版社的ID值

3. 多对多的操作

  # 作者表

  class Author(models.Model):

  id = models.AutoField(primary_key=True)

  name = models.CharField(max_length=16)

  # ORM创建多对多字段,会自动在数据库中创建第三张表

  books = models.ManyToManyField(to=Book)

  author_obj --> 一个作者对象

  author_obj.books.all() --> 作者出版的所有书(书籍对象的列表)

  author_obj.books.set([1,2,3])--> 设置作者关联的书籍(更新的是第三张表)

1,今日内容Django之ORM

1,ORM介绍

ORM的优势

ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。

让软件开发人员专注于业务逻辑的处理,提高了开发效率。

ORM的劣势

ORM的缺点是会在一定程度上牺牲程序的执行效率。

ORM用多了SQL语句就不会写了,关系数据库相关技能退化...

ORM总结

ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。

但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。

但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。

2,ORM常用字段和参数

https://www.cnblogs.com/liwenzhou/p/8688919.html


1. ORM字段和字段参数

AutoField

int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField

一个整数类型,范围在 -2147483648 to 2147483647。

CharField

字符类型,必须提供max_length参数, max_length表示字符长度。

DateField

日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField

日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

2.字段合集(争取记忆)

AutoField(Field)
        - int自增列,必须填入参数 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必须填入参数 primary_key=True

        注:当model中如果没有自增列,则自动会创建一个列名为id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自动创建一个列名为id的且为自增的整数列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定义自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整数 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整数 0 ~ 32767
    IntegerField(Field)
        - 整数列(有符号的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整数 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

    BooleanField(Field)
        - 布尔值类型

    NullBooleanField(Field):
        - 可以为空的布尔值

    CharField(Field)
        - 字符类型
        - 必须提供max_length参数, max_length表示字符长度

    TextField(Field)
        - 文本类型

    EmailField(CharField):
        - 字符串类型,Django Admin以及ModelForm中提供验证机制

    IPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

    GenericIPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
        - 参数:
            protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
            unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

    URLField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证 URL

    SlugField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

    CommaSeparatedIntegerField(CharField)
        - 字符串类型,格式必须为逗号分割的数字

    UUIDField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
        - 参数:
                path,                      文件夹路径
                match=None,                正则匹配
                recursive=False,           递归下面的文件夹
                allow_files=True,          允许文件
                allow_folders=False,       允许文件夹

    FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)

    DateTimeField(DateField)
        - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 时间格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

    FloatField(Field)
        - 浮点型

    DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度

    BinaryField(Field)
        - 二进制类型

字段合集
View Code

3,自定义字段(了解为主)

class UnsignedIntegerField(models.IntegerField):
    def db_type(self, connection):
       return 'integer UNSIGNED'

自定义char类型字段:

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

附ORM字段与数据库实际字段的对应关系

对应关系:
    '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)',

对应关系
View Code

4, 字段参数

null

用于表示某个字段可以为空。

unique

如果设置为unique=True 则该字段在此表中必须是唯一的。

db_index

如果db_index=True 则代表着为此字段设置索引。

default

为该字段设置默认值。

5,DateField和DateTimeField

auto_now_add

配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

auto_now

配置上auto_now=True,每次更新数据记录的时候会更新该字段。

3,关系字段

1. ORM标语表之间的关系

1. 外键关联ForeignKey

外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。

ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

2,字段参数

to(一般关联id)

设置要关联的表

to_field(一般不关联里面的字段

设置要关联的表的字段

related_name

反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。

例如:

class Classes(models.Model):
name = models.CharField(max_length=32)

class Student(models.Model):
name = models.CharField(max_length=32)
theclass = models.ForeignKey(to="Classes")

 

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

models.Classes.objects.first().student_set.all()

当我们在ForeignKey字段中添加了参数 related_name 后,

class Student(models.Model):
name = models.CharField(max_length=32)
theclass = models.ForeignKey(to="Classes", related_name="students")

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

models.Classes.objects.first().students.all()
View Code

related_query_name

反向查询操作时,使用的连接前缀,用于替换表名。

on_delete(常用这个)

当删除关联表中的数据时,当前表与其关联的行的行为。

models.CASCADE

删除关联数据,与之关联也删除

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

Django1.1中默认 2.0必须要手动添加

models.DO_NOTHING

删除关联数据,引发错误IntegrityError

models.PROTECT

删除关联数据,引发错误ProtectedError

models.SET_NULL

删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

models.SET_DEFAULT

删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

models.SET

删除关联数据,

a. 与之关联的值设置为指定值,设置:models.SET(值)

b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

def func():
return 10

class MyModel(models.Model):
user = models.ForeignKey(
to="User",
to_field="id",
on_delete=models.SET(func)
)

db_constraint

是否在数据库中创建外键约束,默认为True。

4,OneToOneField 一对一

一对一字段。

通常一对一字段用来扩展已有字段。

字段参数

to

设置要关联的表。

to_field

设置要关联的字段。

on_delete

同ForeignKey字段。

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

用于第3方登录 只需要获取常用的单独拿出来发一张表,不怎么查询的放另外一张表 一对一 减少数据库简索

5, ManyToManyField多对多

1. 使用ManyToManyField() --> ORM自动帮我创建第三张表

字段参数

to

设置要关联的表

related_name

同ForeignKey字段。

related_query_name

同ForeignKey字段。

symmetrical

仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。

举个例子:

            class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self")
            此时,person对象就没有person_set属性。
            class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False)
此时,person对象现在就可以使用person_set属性进行反向查询。
View Code

through

在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。

但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。

through_fields

设置关联的字段。

db_table

默认创建第三张表时,数据库中表的名称。

关系如下

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

补充一个创建错误如果创建app失败 要么把被关联的放上面,要么加引号反射找到

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

django帮我们创建第3张表

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

自己创建第3张表

区别:如果我们需要格外的字段需要保持只能自己创建第3张表

缺点:看不出有多对多关系,不清晰

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

自己创建第3张表,因为上面得到不完整所以我们得到了 第3种多对多关系两边优点都有,但是要一些方法没有用

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

顺序要写对

 Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

指定第3张表名字没有app前缀

Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

里面不能加参数

3. 手动创建第三张表并设置ManyToManyField(),指定

books = models.ManyToManyField(

        to="Book",

        through="Book2Author",

        through_fields=('author', 'book')

)

元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

db_table

ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。

index_together

联合索引。

unique_together

联合唯一索引。

ordering

指定默认按什么字段排序。

只有设置了该属性,我们查询到的结果才可以被reverse()。

,6, ORM查询操作必知必会13条

https://www.cnblogs.com/liwenzhou/p/8660826.html


filter()支持 双下划线 操作!

总结一下:

1. 返回QuerySet类型的都有哪一些

1. all()

2. filter()

3. exclude()

4. order_by()

5. reverse()

6. distinct()

7. values()

8. values_list()

2. 返回具体对象:

1. get()

2. first()

3. last()

3. 返回具体数字:

1. count()

4. 返回布尔值的:

1. exists()

文件

<1> all():                 查询所有结果
 
<2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
 
<3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
 
<4> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
 
<5> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
 
<6> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
<7> order_by(*field):      对查询结果排序
 
<8> reverse():             对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
 
<9> distinct():            从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
 
<10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
 
<11> first():              返回第一条记录
 
<12> last():               返回最后一条记录
 
<13> exists():             如果QuerySet包含数据,就返回True,否则返回False
View Code

实例

import os

if __name__ == '__main__':
    # 指定当前py脚本需要加载的Django项目配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
    # 启动Django项目
    import django
    django.setup()

    from app01 import models

    # ret = models.Book.objects.all()  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # ret = models.Book.objects.filter(title="围城")  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # ret = models.Book.objects.filter(id=1)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # id值大于1
    # ret = models.Book.objects.filter(id__gt=1)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # id值小于3
    # ret = models.Book.objects.filter(id__lt=3)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # 出版日期是2017年的书
    # ret = models.Book.objects.filter(publisher_date__year=2017)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # 出版日期大于2017年
    # ret = models.Book.objects.filter(publisher_date__year__gt=2017)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)
    # 书名中包含'曌'的书
    # ret = models.Book.objects.filter(title__contains="曌")  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # 书名中包含'曌'的书并且出版年份是2018年
    # ret = models.Book.objects.filter(title__contains="曌", publisher_date__year=2018)  # QuerySet类型  --> 书籍对象的列表
    # print(ret)

    # get方法 如果检索条件找不到对象就报错
    # ret = models.Book.objects.get(id=10)  # 具体的类对象实例  --> 书籍对象
    # print(ret)

    # 使用filter检索的时候没有满足条件的数据就返回一个空 QuerySet
    # ret = models.Book.objects.filter(id=10)  # 具体的类对象实例  --> 书籍对象
    # print(ret)

    # 将满足条件的去掉,留下不满足条件的
    # ret = models.Book.objects.exclude(id__in=[1,3,4])
    # print(ret)

    # values 取字段的值
    # ret = models.Book.objects.filter(publisher_date__year=2018).values("title", "publisher_date")  # QuerySet类型  --> 字段及字段值的字典的列表
    # print(ret)
    #
    # ret = models.Book.objects.filter(publisher_date__year=2018).values_list("title", "publisher_date")  # QuerySet类型  --> 字段值的元祖的列表
    # print(ret)

    # 按字段排序
    # ret = models.Book.objects.all().order_by("price")  # QuerySet类型  --> 根据price字段对所有数据排序
    # print(ret)
    #
    # ret = models.Book.objects.all().order_by("-price")  # QuerySet类型  --> 根据price字段对所有数据排序
    # print(ret)
    #
    # ret = models.Book.objects.all().order_by("price").reverse()  # QuerySet类型  --> 根据price字段对所有数据排序
    # print(ret)
    #
    # # 按照出版时间排序
    # ret = models.Book.objects.all().order_by("publisher_date").reverse().values("title")  # QuerySet类型  --> 根据price字段对所有数据排序
    # print(ret)

    # 连表查询
    # ret = models.Book.objects.all().values("publisher__name").distinct()  # QuerySet类型  --> 根据price字段对所有数据排序
    # print(ret)


    # count 计数
    # ret = models.Book.objects.all().count()  # 数字  --> 结果集中数据的个数
    # print(ret)

    # first()和last()
    # ret = models.Book.objects.all().first()  # 对象  --> 结果集中的第一个数据
    # print(ret)

    # 判断结果集中是否有数据
    ret = models.Book.objects.all().exists()  # 布尔值  --> 结果集中是否有数据
    print(ret)
View Code

7,补充在Python脚本中调用Django环境

如果我们想要用脚本的方式查询数据库的一些操作

Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

8,补充时间应用应

Django之ORM
  1,内容回顾
2. ORM(对象关系映射)
1,今日内容Django之ORM
2,ORM常用字段和参数
3,关系字段
4,OneToOneField 一对一
5, ManyToManyField多对多
,6, ORM查询操作必知必会13条
7,补充在Python脚本中调用Django环境
8,补充时间应用应

用于活动优惠价倒计时等

3. 今日作业

1. 复习一下基础知识

2. 把上课讲的字段和字段参数 整理好笔记

3. 把必知必会13条自己写一遍,看一下SQL语句

4. MySQL复习:

1. 字段类型

2. 联合索引

3. 连表查询

4. bettwen and

5. 。。。