Django第二天
一、ORM模型之字段类型
1.1字段类型
1.2约束
1.3FileField和ImageField
文件字段和图片字段都属于MEDIA的多媒体类型的文件,需要在settings.py设置脚本文件中指定
MEDIA_ROOT\MEDIA_URL\STATIC_URL \STATICFILES_DIRS
使用imageField时,必须安装pillow库
pip install Pillow
扩展:github:https://github.com/disenQF/storeOA.git
二、模型的Meta元信息
在模型类中,声明内部类Meta,类成员可以如下的变量:
- db_table
- ordering
- verbose_name
- verbose_name_plural
- unique_together
- abstract 布尔类型,当前的模型类是否为抽象类,如果是,则不会创建表。
3.渲染模板的render()方法有哪些参数,分别代表的含义
- request 请求对象,是django.http.HttpRequst类的对象
- 模板的html文件,是字符串类型,文件位置相对于templates目录的
- context上下文,是dict字典类型,可以使用local()将本地的变量转成字典对象
三、CURD深度使用
3.1了解模型类中的objects是什么?
默认情况下,由创建模型类的元类在模型类中会创建django.db.Manager类的对象,赋给objects。
Manager类实际是QuerySet类的子类。
我们可以在模型类中,创建objects,但是必须为Manager类对象,不能是普通的字段
class CtaeTYPEentity(models.Model):
name = models.CharField(max_length)
# objects = models.IntegerField(default=0) 错误写法
objects = models.Manager() # 正确写法
查询
def find_fruit(request):
# 从查询参数中获取价格区间price1,price2
price1 = request.GET.get('price1', 0)
price2 = request.GET.get('price2', 1000)
# 根据价格区别查询满足条件所以水果信息
fruits = FruitEntity.objects.filter(price__gte=price1, price__lte=price2).all()
# 将查询的数据渲染到html模板中
return render(request, 'fruit/list.html', locals())
3.2filter和exclude查询
模型类.objects.filter(属性名__条件=条件值)
模型类.objects.filter(属性名=条件值)
模型类.objects.filter(属性名__时间属性__条件=条件值)
条件包含
-
大于gt、小于lt、大于等于gte、小于等于lte
-
字符串相关:contains 包含(区分大小写)、icontains、(i)startwith、(i)endswith、
-
null相:isnull,isnotnull
-
范围:in
时间属性包含:
- year、month、day
- hour、minute、second
3.3 Qeryset对象的方法
Qeryset对象的本身是可以被迭代的。
返回Qeryset对象的方法有:
- filter()
- exclude()
- all()
- values()
- values_list()
def find_store(request):
# 查询2022年开业的水果店
# 查询参数:year
# stores = StoreEntity.objects.filter(create_time__year=2022).all()
queryset = StoreEntity.objects.filter(create_time__year__lt=2022).all().order_by('id')
# first_store = queryset.first() # 返回的也是queryset对象
# last_store = queryset.last()
# print(first_store)
stores = queryset.all()
return render(request, 'store/list.html', locals())
单个对象:
- get()
- last() 返回查询集中的最后一个对象
- first() 返回查询集中的第一个对象
其他方法:
- count() 返回当前查询集中的对象个数
- exists() 判断查询集中是否有数据,如果有数据返回True
- values() (Qeryset类对象)每一条数据就是一个字典对象. 如果API接口,即返回json数据时,用此方法。
- order_by(‘name’,) 排序
聚合函数
aggregate() 帮助我们去计算一些属性的值
常用统计函数(先导包)
Avg、Max、Min、Sum、Count
def count_fruit(request):
# 返回json数据:统计每种分类的水果数量、最高价格、最低价格和水果总价格
result = FruitEntity.objects.aggregate(Count('name'), Max('price'), Min('price'), Avg('price'), Sum('price'))
return JsonResponse(result)
1.Qeryset中是否存在delete()方法来删除满足条件的所以数据?
2.增加水果图片的信息