Django学习笔记二

Django学习笔记二

一 字段属性和选项

1.1 模型类属性命名限制

1)不能是python的保留关键字。
2)不容许使用连续的下划线,这是由django的查询方式决定的。
3)定义属性时须要指定字段类型,经过字段类型的参数指定选项,语法以下:
属性名=models.字段类型(选项)javascript

1.2 字段的类型

使用时须要引入django.db.models包,字段类型以下:html

类型 描述
AutoField 自动增加的IntegerField,一般不用指定,不指定时Django会自动建立属性名为id的自动增加属性。
BooleanField 布尔字段,值为True或False。
NullBooleanField 支持Null、True、False三种值。
CharField(max_length=最大长度) 字符串。参数max_length表示最大字符个数。
TextField 大文本字段,通常超过4000个字符时使用。
IntegerField 整数
DecimalField(max_digits=None, decimal_places=None) 十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。
FloatField 浮点数。参数同上
DateField:([auto_now=False, auto_now_add=False]) 日期。1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它老是使用当前日期,默认为false。2) 参数auto_now_add表示当对象第一次被建立时自动设置当前时间,用于建立的时间戳,它老是使用当前日期,默认为false。3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField 时间,参数同DateField。
DateTimeField 日期时间,参数同DateField。
FileField 上传文件字段。
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片

对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
经验:
当修改模型类以后,若是添加的选项不影响表的结构,则不须要从新作迁移,商品的选项中default和blank不影响表结构。
参考文档:
http://python.usyiyi.cn/translate/django_182/index.htmljava

1.3 选项

经过选项实现对字段的约束,选项以下:python

选项名 描述
default 默认值。设置默认值。
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,通常做为AutoField的选项使用。
unique 若是为True, 这个字段在表中必须有惟一值,默认值是False。
db_index 若值为True, 则在表中会为此字段建立索引,默认值是False。
db_column 字段的名称,若是未指定,则使用属性的名称。
null 若是为True,表示容许为空,默认值是False。
blank 若是为True,则该字段容许为空白,默认值是False。

对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。
经验:
当修改模型类以后,若是添加的选项不影响表的结构,则不须要从新作迁移,商品的选项中default和blank不影响表结构。
参考文档:
http://python.usyiyi.cn/translate/django_182/index.htmlmysql

class BookInfo(models.Model): '''图书模型类''' # 图书名称 btitle = models.CharField(max_length=20, db_column='title') # 图书名字惟一 # btitle = models.CharField(max_length=20, unique=True, db_index=True) # 价格,最大位数为10,小数为2 # bprice = models.DecimalField(max_digits=10, decimal_places=2) # 出版日期 bpub_date = models.DateField() # bpub_date = models.DateField(auto_now_add=True) # 建立时间 # bpub_date = models.DateField(auto_now=True) # 更新时间 # 阅读量 bread = models.IntegerField(default=0) # 评论量 bcomment = models.IntegerField(default=0) # 删除标记 isDelete = models.BooleanField(default=False) # book = models.Manager() # 自定一个Manager类对象,管理器对象 objects = BookInfoManager() # 自定义一个BookInfoManager类的对象 # @classmethod # def create_book(cls, btitle, bpub_date): # '''添加一本图书''' # # 建立一个cls类的对象 # obj = cls() # obj.btitle = btitle # obj.bpub_date = bpub_date # # 添加进数据库 # obj.save() # # 返回obj # return obj class Meta: db_table = 'bookinfo' # 指定模型类对应表名 

二查询

2.1 mysql的查询日志

mysql.log是mysql的日志文件,里面记录的对MySQL数据库的操做记录。默认状况下mysql的日志文件没有产生,须要修改mysql的配置文件,步骤以下:
1)使用下面的命令打开mysql的配置文件,去除68,69行的注释,而后保存。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2)重启mysql服务,就会产生mysql日志文件。
sudo service mysql restart
3)打开MySQL的日志文件。
/var/log/mysql/mysql.log 是mysql日志文件所在的位置。
使用下面的命令能够实时查看mysql的日志文件:
sudo tail -f /var/log/mysql/mysql.loggit

2.2 查询函数

经过模型类.objects属性能够调用以下函数,实现对模型类对应的数据表的查询。web

函数名 功能 返回值 说明
get 返回表中知足条件的一条且只能有一条数据。 返回值是一个模型类对象。 参数中写查询条件。1) 若是查到多条数据,则抛异常MultipleObjectsReturned 2)查询不到数据,则抛异常:DoesNotExist。
all 返回模型类对应表格中的全部数据 返回值是QuerySet类型 查询集
filter 返回知足条件的数据 返回值是QuerySet类型 参数写查询条件。
exclude 返回不知足条件的数据 返回值是QuerySet类型 参数写查询条件
order_by 对查询结果进行排序 返回值是QuerySet类型 参数中写根据哪些字段进行排序

get示例:
例:查询图书id为3的图书信息。
all方法示例:
例:查询图书全部信息。
filter方法示例:
条件格式:
模型类属性名__条件名=值
查询图书评论量为34的图书的信息:
a)判等 条件名:exact。
例:查询编号为1的图书。sql

BookInfo.objects.get(id=1)

b)模糊查询
例:查询书名包含'传'的图书。contains数据库

BookInfo.objects.filter(btitle__contains='传')

例:查询书名以'部'结尾的图书 endswith 开头:startswithdjango

BookInfo.objects.filter(btitle__endswith='部')

c)空查询 isnull
例:查询书名不为空的图书。isnull

select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)范围查询 in
例:查询id为1或3或5的图书。

select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比较查询 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查询id大于3的图书。

Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查询
例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1往后发表的图书。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查询id不为3的图书信息。

BookInfo.objects.exclude(id=3)

order_by方法示例:
做用:进行查询结果进行排序。
例:查询全部图书的信息,按照id从小到大进行排序。

BookInfo.objects.all().order_by('id')

例:查询全部图书的信息,按照id从大到小进行排序。

BookInfo.objects.all().order_by('-id')

例:把id大于3的图书信息按阅读量从大到小排序显示。

BookInfo.objects.filter(id__gt=3).order_by('-bread')

三 F和Q对象

F对象的做用:用于类属性之间的比较
使用以前须要先导入:

from django.db.models import F

例:查询图书阅读量大于评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查询图书阅读量大于2倍评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q对象的做用:用于查询时条件之间的逻辑关系。not and or,能够对Q对象进行&|~操做。
使用以前须要先导入:

from django.db.models import Q

例:查询id大于3且阅读量大于30的图书的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查询id大于3或者阅读量大于30的图书的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查询id不等于3图书的信息。

BookInfo.objects.filter(~Q(id=3))

四 聚合函数

做用:对查询结果进行聚合操做。
sum count avg max min
aggregate:调用这个函数来使用聚合。 返回值是一个字典
使用前需先导入聚合类:

from django.db.models import Sum,Count,Max,Min,Avg

例:查询全部图书的数目。

BookInfo.objects.all().aggregate(Count('id'))

{'id__count': 5}
例:查询全部图书阅读量的总和。

BookInfo.objects.aggregate(Sum('bread'))

{'bread__sum': 126}
count函数 返回值是一个数字
做用:统计知足条件数据的数目。
例:统计全部图书的数目。

BookInfo.objects.all().count()
BookInfo.objects.count()

例:统计id大于3的全部图书的数目。

BookInfo.objects.filter(id__gt=3).count()

小结:
enter description here

参考文档:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html

五 查询集

all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象能够继续调用上面的全部函数。
5.1 查询集特性
1) 惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2) 缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,而后把结果缓存起来,以后再使用这个查询集时,使用的是缓存中的结果。
5.2 限制查询集
能够对一个查询集进行取下标或者切片操做来限制查询集的结果。
对一个查询集进行切片操做会产生一个新的查询集,下标不容许为负数。
取出查询集第一条数据的两种方式:

方式 说明
b[0] 若是b[0]不存在,会抛出IndexError异常
b[0:1].get() 若是b[0:1].get()不存在,会抛出DoesNotExist异常。

exists:判断一个查询集中是否有数据。True False

六 模型类的关系

1) 一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多的类中。
2) 多对多关系
例:新闻类-新闻类型类 体育新闻 国际新闻
models.ManyToManyField() 定义在哪一个类中均可以。
3) 一对一关系
例:员工基本信息类-员工详细信息类. 员工工号
models.OneToOneField定义在哪一个类中均可以。
'''

# 新闻类型类
class NewsType(models.Model):
    # 类型名
    type_name = models.CharField(max_length=20)
    # 关系属性,表明类型下面的信息
    type_news = models.ManyToManyField('NewsInfo')

# 新闻类
class NewsInfo(models.Model):
    # 新闻标题
    title = models.CharField(max_length=128)
    # 发布时间
    pub_date = models.DateTimeField(auto_now_add=True)
    # 信息内容
    content = models.TextField()
    # 关系属性, 表明信息所属的类型
    # news_type = models.ManyToManyField('NewsType')

七 关联查询(一对多)

7.1 查询和对象关联的数据

在一对多关系中,一对应的类咱们把它叫作一类,多对应的那个类咱们把它叫作多类,咱们把多类中定义的创建关联的类属性叫作关联属性。
例:查询id为1的图书关联的英雄的信息。

b=BookInfo.objects.get(id=1)
    b.heroinfo_set.all()

经过模型类查询:
HeroInfo.objects.filter(hbook__id=1)
例:查询id为1的英雄关联的图书信息。

h = HeroInfo.objects.get(id=1)
    h.hbook

经过模型类查询:

BookInfo.objects.filter(heroinfo__id=1)

格式:
enter description here

由一类的对象查询多类的时候:
一类的对象.多类名小写_set.all() #查询所用数据
由多类的对象查询一类的时候:
多类的对象.关联属性 #查询多类的对象对应的一类的对象
由多类的对象查询一类对象的id时候:
多类的对象. 关联属性_id

7.2 经过模型类实现关联查询

 

enter description here
enter description here

 

例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的全部英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')
经过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
经过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)

八 删除,更新,插入,自关联

调用一个模型类对象的save方法的时候就能够实现对模型类对应数据表的插入和更新。
调用一个模型类对象的delete方法的时候就能够实现对模型类对应数据表数据的删除。
自关联:

 

enter description here
enter description here

自关联是一种特殊的一对多的关系。
案例:显示广州市的上级地区和下级地区。
地区表:id, atitle, aParent_id;
mysql终端中批量执行sql语句:source areas.sql;

 

class AreaInfo(models.Model): '''地址模型类''' # 地区名称 atitle = models.CharField(verbose_name='标题', max_length=20)
    # 自关联属性
    aParent = models.ForeignKey('self', null=True, blank=True)

    def __str__(self):
        return self.atitle

    def title(self):
        return self.atitle
    title.admin_order_field = 'atitle'
    title.short_description = '地区名称'

    def parent(self):
        if self.aParent is None:
            return ''
        return self.aParent.atitle
    parent.short_description = '父级地区名称'

九 管理器

  1. BookInfo.objects.all()->objects是一个什么东西呢?
    答:objects是Django帮我自动生成的管理器对象,经过这个管理器能够实现对数据的查询。
    objects是models.Manger类的一个对象。自定义管理器以后Django再也不帮咱们生成默认的objects管理器。

  2. 自定义模型管理器类
    1)自定义一个管理器类,这个类继承models.Manger类。
    2)再在具体的模型类里定义一个自定义管理器类的对象。

  3. 自定义管理器类的应用场景
    1) 改变查询的结果集。
    好比调用BookInfo.books.all()返回的是没有删除的图书的数据。
    2) 添加额外的方法。
    管理器类中定义一个方法帮咱们操做模型类对应的数据表。
    使用self.model()就能够建立一个跟自定义管理器对应的模型类对象。

# Create your models here.
class BookInfoManager(models.Manager):
    '''图书模型管理器类'''
    # 1.改变原有查询的结果集
    def all(self):
        # 1.调用父类的all方法,获取全部数据
        books = super().all() # QuerySet
        # 2.对books中的数据进行过滤
        books = books.filter(isDelete=False)
        # 返回books
        return books

    # 2.封装方法,操做模型类对应的数据表(增删改查)
    def create_book(self, btitle, bpub_date):
        '''添加一本图书'''
        # 1.建立一个图书对象
        # 获取self所在的模型类
        model_class = self.model
        book = model_class()
        # book = BookInfo()
        book.btitle = btitle
        book.bpub_date = bpub_date
        # 2.添加进数据库
        book.save()
        # 3.返回book
        return book

小结:

 

enter description here
enter description here
相关文章
相关标签/搜索