Django 基础知识

一、ORM

1-1 查询API:

filter(**kwargs)  # 它包含了与所给筛选条件相匹配的对象
all()             # 查询所有结果
get(**kwargs)      # 返回与所给筛选条件相匹配的对象,返回的结果有且只有一个,超过则报错
values(*field)     # 返回一个valueQuerySet,一个特殊QuerySet(对象集合),返回结果是
                     一个可迭代的字典序列
exclude(**kwargs)  # 它包含了与所给筛选条件不匹配的对象
order_by(*field)   # 对查询结果进行排序
reverse()         # 对查询结果进行反向排序
distinct()         # 从返回结果中剔除重复记录
count()            # 返回数据库中匹配查询(QuerySet)的对象数量
first()            # 返回第一条记录
last()             # 返回最后一条记录
exists()           # 如果QuerySet包含数据,就返回True,否则返回False

 1-2 双下划线查询

model.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
model.Tb1.objects.filter(id__in[11, 22, 33])  # 获取id等于11、22、33的数据
model.Tb1.objects.exclude(id__lt=10, id__gt=1)# 获取id不等于11、22、33的数据
model.Tb1.objects.filter(name_contains='ven') # 获取name值包含ven(区分大小写)
model.Tb1.objects.filter(name_icontains='ven') # 获取name值包含ven(不区分大小写)
model.Tb1.objects.filter(id__range=[1, 3]) # 获取id在区间1~3中的值(范围bettwen and)

1-3 多表操作(多对多):

  创建多对多的关系  author = models.ManyToManyFiled("Author") 

  书籍对象它的所有关联作者  obj = book_obj.authors.all()

      绑定多对多关系     obj.add(*QuerySet)  参数:一条或者多条(前面加*)

      解除多对多关系     obj.remove(author_obj)

------------> 聚合查询和分组查询

<1> aggregate(*args, **kwargs):

  通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数指定一个包含在字典中的返回值。即在查询集上生产聚合

from django.db.models import Avg, Min, Sum, Max
从整个查询生产统计值。比如,你想要计算所有在售书的平均值。Django的查询语法提供了一种方式描述
所有图书的集合

<2> annotate(*args, **kwargs):

  通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),

即为查询集的每一项生产聚合。

  查询alex出的书总价格

       

  查询各个作者出的书的总价格,这里就涉及到分组了,分组条件是authors_name

  

------------> 惰性机制

  所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),

它并不会马上执行sql语句,而是当调用QuerySet的时候才执行。

QuerySet 特点

  1、可迭代的

  2、可切片

objs = models.Book.objects.all() # [obj1, obj2, obj3, ...]

QuerySet: 可迭代

for obj in objs: # 每一个obj就是一行对象
    print("obj:", obj)

QuerySet: 可切片
print(objs[1])
print(objs[1:4])
print(objs[::-1])

 ------------> 迭代器对象(iterator())

当QuerySet非常巨大时,cache会成为问题

处理成千上万的记录时,将它们一次装入n内存是浪费的。更糟糕的是,巨大的QuerySet可能会锁住系统进程,
让你的程序濒临崩溃。要避免在遍历数据的同时产生QuerySet cache(缓存),可以使用iterator()方法
来获取数据,处理完成就将其丢弃。
objs = Book.objects.all().iterator()
# iterator() 可以一次只从数据库获取少量数据,这样可以节省内存
for obj in objs:
print(obj.name)
# BUT,再次遍历就没有打印,因为迭代器已经在上一次遍历(next)到最后一次了,再次遍历就没有了数据

# 当然,使用iterator()方法来防止生产cache,意味着遍历同一个QuerySet是会重复执行查询。所有
# 用iterator()的时候要当心,确保你的代码在操作一个大的QuerySet是没有重复执行查询

总结:
    QuerySet的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询
数据库。使用exists()和iterator()方法可以优化程序对内存的使用。不过,由于它们并不会产生
QuerySet cache,可能会对造成额外的数据库查询。
    总而言之,再执行代码中,需多次查询数据库时,使用cache中的exists;数据量较大时,使用
iterator迭代器对象

二 、 admin(数据库内容管理)

Django 提供了基于 web 的管理工具。

<1>生产迁移表

<2>创建超级用户

 二、templates模板语言

1-1自定义过滤器

自定义过滤器函数,至少有一个参数,最多两个参数

1)在应用里新建templatetags文件夹

2)设计代码逻辑

3)进入到模板页面中到导入刚创建的filter.py文件

4)调用自定义的过滤器

原文地址:https://www.cnblogs.com/renshaoqi/p/10465589.html