Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django-models & QuerySet API

Django-models & QuerySet API

作者头像
kirin
发布于 2020-07-23 02:09:12
发布于 2020-07-23 02:09:12
1.5K00
代码可运行
举报
文章被收录于专栏:Kirin博客Kirin博客
运行总次数:0
代码可运行

django中配置mysql数据库

查询queryset时如果需要选取查询集中的某个子集的字段时,

应该用切片,或者first 选择某个子集对象,这样才能够使用到

子集的字段,直接queryset后选择字段会直接报错

1,首先配置settings.py。

一是在INSTALLED_APPS里面加入app名称;

二是配置数据库相关信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
View Code

定义数据库表结构  models.py

使用orm框架,不需要编写原生的sql语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models
class Person(models.Model):         #一个类对应一张表
    name = models.CharField(max_length=64)  # 字符串类型,必须加参数max_length  
    age = models.IntegerField()        #整数类型
    def __str__(self):     # 获取Person的对象时,显示name以便于区别
        return self.name
常用字段

IntegerField  – 整型 BooleanField  – 布尔值类型 NullBooleanField  – 可以为空的布尔值 CharField     – 字符串类型 必须提供max_length参数,字符长度 TextField      – 文本类型 EmailField     – 一个带有检查 Email 合法性的 CharField GenericIPAddressField      IP地址 URLField        URL类型 SlugField  – 字符串类型,只包含字母,数字,下划线或连字符 CommaSeparatedIntegerField   – 字符串类型,格式必须为逗号分割的数字 UUIDField   uuid类型 DateTimeField     – 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField   – 日期格式 YYYY-MM-DD TimeField   – 时间格式 HH:MM[:ss[.uuuuuu]] FloatField(Field)    – 浮点型 DecimalField(Field)   – 10进制小数 BinaryField(Field)    – 二进制类型

参数

null     为True时,数据库里的字段可以为空,如果想要生效需要设置blank=True。 blank    为True时,admin中可以为空。但是不限制数据库,要想限制数据库里,需要设置null。 choices   选择框。例如 gender = models.CharField(max_length=6, choices=gender_choices, default=’male’) default   字段默认值 editable   默认都可以修改,如果为false,admin上面不可修改且不显示,但是数据库可以改 error_messages   自定义错误信息,是字典类型 help_text   该字段的提示信息 unique    值唯一 verbose_name   显示的字段名称

更多字段查看官网:https://docs.djangoproject.com/en/2.1/ref/models/fields/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
View Code
 创建表

# python manage.py makemigrations #  python manage.py migrate

QeurySet API

数据库接口相关的接口叫queryset api。从数据库中查询出来的结果一般是一个QuerySet集合。

创建数据

>python manage.py shell

>>> from app01.models import Person

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#方法一:
>>> Person.objects.create(name='lily',age=20)
<Person: lily>
>>> Person.objects.create(name='jack',age=28)
<Person: jack>

批量添加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Person.objects.bulk_create([Person(tname='老唐',gender='male'),
                                Person(tname='老陈',gender='female')])
[<Person: 老唐>, <Person: 老陈>]  # 批量添加

查询数据

all 获取所有对象列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Person.objects.all()  #查询所有
<QuerySet [<Person: lily>, <Person: jack>, <Person: beibei>, <Person: hei>]>
>>> Person.objects.all()[:3]  #切片操作
<QuerySet [<Person: lily>, <Person: jack>, <Person: beibei>]>
>>> obj_list = Person.objects.all()
>>> for i in obj_list:     #迭代对象列表
...     print(i.name,i.age)
...
lily 22
jack 28
beibei 20
hei 1
>>>

filter  过滤,返回符合条件的一批对象,列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Person.objects.filter(id=1)
<QuerySet [<Person: lily>]>
>>> Person.objects.filter(name='lily',age=22) #多个条件逗号分隔
<QuerySet [<Person: lily>]>
 
#模糊查询,contains,endswith,startswith,range,regex
>>> Person.objects.filter(name__contains='bei')  #contains 包含
>>> Person.objects.filter(name__icontains='BEI')  #icontains 包含,不区分大小写
>>> Person.objects.filter(name__startswith='ja')   #startswith
>>> Person.objects.filter(name__endswith='ck')   #endswith
>>> Person.objects.filter(age__range=[20,30])     #range范围
>>> Person.objects.filter(name__regex='^bei')  #regex正则
#时间类型 year,month,week,day
>>> models.Person.objects.filter(birthday__year=1990)  # __year
>>> models.Person.objects.filter(birthday__month=12)   # __month
# 大小 gt,lt,gte,lte
>>> models.Person.objects.filter(age__lte = 20)
# 一个表里面两个字段大小对比 F()
>>>  from django.db.models import F
>>>  models.Person.objects.filter(age__lt=F('birthday'))  # age小于birthday
等同于sql:select age,birthday from Person where age < birthday;
>>>  models.Person.objects.filter(age__lt=F('birthday')/2)  # 运算

  Q() 方法  复杂查询 and( , )  or( | )   not( ~ )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db.models import Q
>>> s = School.objects.get(school_name='深大')
>>> Student.objects.filter(Q(age__gt=20)|Q(school=s))  # or
<QuerySet [<Student: 小南>, <Student: 小丽>]>
>>> Student.objects.filter(Q(age__gt=20),Q(school=s))    #and
<QuerySet [<Student: 小南>]>
>>> Student.objects.filter(Q(age__gt=20),~Q(school=s))  # and,not
<QuerySet [<Student: 小丽>]>
#可以使用Q()和普通查询结合,但是Q必须放在前面
>>> Student.objects.filter(Q(age__gt=20),~Q(school=s),sname__icontains='小')         
<QuerySet [<Student: 小丽>]>

values  返回一个大列表。列表里的元素是字典,而不是queryset对象列表。每个字典代表一个对象

values_list  列表里面的元素是元祖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Student.objects.values()
<QuerySet [{'id': 13, 'sname': '小南', 'age': 34, 'school_id': 8, 'status': 'registered'}, {'id': 14, 'sname': '小北'
, 'age': 30, 'school_id': 5, 'status': 'registered'}, .....}]>
 
>>> models.Person.objects.filter(id__gt=3).values()
<QuerySet [{'id': 4, 'name': '小陈', 'age': 7, 'birthday': datetime.date(1992, 12, 12)}]>
>>> models.Person.objects.filter(id__gt=3).values('name','age')
<QuerySet [{'name': '小陈', 'age': 7}]>

exclude  排除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
models.Person.objects.filter(birthday__month=12).exclude(age__gt=12)
<QuerySet [<Person: 小陈>]>

oder_by 排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> models.Person.objects.order_by('birthday')[0]  #排序完后取第一条

get  返回与查找条件相匹配的一个对象

 注意: 如果找到多个对象,则会报错:MultipleObjectsReturned

如果没有找到对象,则会报错:DoesNotExist

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Person.objects.get(name='jack')
<Person: jack>
>>> Person.objects.get(name='jack').name
'jack'
>>> Person.objects.get(name='jack').age
28

聚合 aggregate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Student.objects.count()  #统计个数
3
>>> from django.db.models import Max,Min,Avg,Sum
>>> Student.objects.all().aggregate(Max('age'),Min('age'),Avg('age'),Sum('age'))
{'age__max': 35, 'age__min': 30, 'age__avg': 33.0, 'age__sum': 99}
>>> Student.objects.all().aggregate(sum_of_age=Sum('age'))   #自定义聚合名字
{'sum_of_age': 99}
 
from django.db.models import Count    #关联关系的count
>>> obj = School.objects.annotate(Count('student'))
>>> obj
<QuerySet [<School: 北大>, <School: 深大>]>
>>> obj[0].student__count
2
>>> for i in obj:
... if i.school_name == '深大':
... print(i.student__count)
...
2

修改数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#修改一条数据
>>> p = Person.objects.get(name='hei')
>>> p.name='kangkang'
>>> p.age=24
>>> p.save()
# 批量修改
>>> Person.objects.filter(age=28).update(age=29)
1
>>> Person.objects.all().update(age=0)  
4

删除数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> Person.objects.filter(name__contains='kang').delete()  
(1, {'app01.Person': 1})   #删除了一条数据

另一种方法:通过admin页面对数据进行增删改查

1,创建admin用户名密码

>python manage.py createsuperuser

2,在应用下admin.py中引入自身的models模块(或里面的类)

vim admin.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from .models import Person
admin.site.register(Person)

3, python manage.py runserver

访问127.0.0.1:8000/admin可以在后台页面看到app01站点下的Person类。

(补充)关系型字段

多对一    ForeignKey 多对多   ManyToManyField

例如:学生跟老师是多对多关系,学生跟学校是多对一关系:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim models.py

models.ForeignKey()   python3里面需要加上on_delete参数,CASCADE:此值设置,是级联删除。否则会报错

生成数据表:

>python manage.py makemigrations formapp >python manage.py migrate formapp  #  Django会自动创建一个中间连接表student_teacher来表示多对多关系

通过关联关系在命令行添加数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#添加学生
#方法一:
>>> t1=Teacher.objects.get(tname='老唐')
>>> s1=School.objects.get(school_name='北大')
>>> t1.student_set.create(sname='小北',age=23,school=s1)
<Student: 小北>
#方法二:
>>> S=Student(sname='小南',age=22,school=School.objects.get(city='深圳'))
>>> S.save()
>>> t2=Teacher.objects.get(tname="老陈")
>>> S.teacher.add(t2)
>>> S.save()  #保存生效
>>> S.school
<School: 深大>
>>> S.teacher
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x0000000003EEC748>   
>>>S.teacher.values()
<QuerySet [{'id': 4, 'tname': '老陈', 'gender': 'female'}]>

从数据库可以看到关联关系:

ForeignKey类型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from formapp.models import Student, School, Teacher
stu = Student.objects.get(sname='小北')
sch = School.objects.get(school_name='清华')
stu.school = sch 
stu.save()   #保存生效

  删除数据:

学生- 学校,多对一。  删除学校,会把对应的学生也给删掉, 因为 on_delete= CASCADE。会删除包含foreignKey的学生对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> s=models.School.objects.get(school_name='深大')
>>> s.delete()
(4, {'formapp.Student_teacher': 1, 'formapp.Student': 2, 'formapp.School': 1})

ManyToMany类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s1 = Student.objects.get(sname='小冬')
t1 = Teacher.objects.get(tname="老陈")
t2 = Teacher.objects.create(tname='老严')
s1.teacher.add(t1, t2)   
print(s1.teacher.values())
---<QuerySet [{'id': 4, 'tname': '老陈', 'gender': 'female'}, {'id': 11, 'tname': '老严', 'gender': ''}]>

 删除数据:

学生-老师,多对多关系。删除老师不会删除对应的学生,只会删除关联关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> t = models.Teacher.objects.get(tname='老陈')
>>> t.delete()
(3, {'formapp.Student_teacher': 2, 'formapp.Teacher': 1})

 反向关联查询

student表里面写了 ForeignKey, ManyToMany。school和teacher表里并没有写,但是他们可以通过反向关联,查找到对应的student:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> School.objects.get(school_name='北大').student_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x0
000000003F57908>
>>> School.objects.get(school_name='北大').student_set.select_related()
<QuerySet [<Student: 小北>, <Student: 小丽>]>
 
>>> Teacher.objects.last().student_set
>>> Teacher.objects.last().student_set.select_related()
<QuerySet [<Student: 小丽>, <Student: 小北>, <Student: 小南>]>

从外部的脚本调用Django的models表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os, sys
PROJECT_DIR = os.path.dirname((os.path.dirname(os.path.abspath(__file__))))
sys.path.append(PROJECT_DIR)   # 将django项目根目录加入到环境变量
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'  # 引入django的配置文件
import django
django.setup()           # 加载项目配置
from formapp.models import Student  #导入formapp的Student表
s = Student.objects.all()   # 操作数据库
print(s)
结果:
<QuerySet [<Student: 小北>, <Student: 小南>, <Student: 小冬>]>
 
 
 
 
文章出自https://www.cnblogs.com/xiaobaozi-95/p/10180898.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django 之 Models(Models 模型 & 数据表关系)
<font color="red">欢迎阅读本专栏其他文章</font> Django 之路由篇 Django 之视图篇 Django 之模板篇 Models 模型 ORM --- ObjectRelationMap: 把面向对象思想转换成关系数据库思想,操作上把类等价于表格 类对应表格 类中的属性对应表中的字段 在应用中的models.py 文件中定义class 所有需要使用ORM的class都必须是 models.Model 的子类 class 中的所有属性对应表格中的字段 字段的类型都必须使用 mod
ruochen
2021/05/12
2.4K0
Django 之 Models(Models 模型 & 数据表关系)
Django之ORM
Django默认使用的是sqlite,如果想使用mysql来存储数据,需要改变成相应的数据库引擎,具体如下:
py3study
2020/01/20
1.1K0
Django模型(数据库)及Django Query常用方法
Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。 新建项目和应用
Python攻城狮
2018/08/23
2.6K0
Django模型(数据库)及Django Query常用方法
django_2
要求 修改数据库 Django shell 数据级联(一对多) 元信息 定义字段 模型过滤 创建对象4种方式 查询集 过滤器 获取单个对象 字段查询 时间 聚合函数 跨关系查询 F对象 Q对象 学习课程 1.修改数据库 ① 在settings中的DATABASES中进行修改 ‘ENGINE’: ‘django.db.backends.mysql’, ’NAME‘ : 数据库名字 ’USER‘: 用户名字 ’PASSWORD‘:密码 ’HOST‘: 主机 ’PORT‘: 端口号 注意:引号加不加“”都
以某
2023/03/07
3.7K0
django_2
Django篇(二)
'ENGINE':'django.db.backends.mysql',
不断折腾
2019/09/23
1.4K0
Django之Model操作数据库详解
O(objects):类和对象。R(Relation):关系,关系数据库中的表格。M(Mapping):映射。
菲宇
2022/12/21
7.2K0
16 . PythonWeb框架之Django
项目运行起来,访问IP:PORT/admin即可访问登录页面,但是需要先创建一个超级用户
iginkgo18
2020/09/27
2.6K0
16 . PythonWeb框架之Django
Django MVT之M
在Django MVC概述和开发流程中已经讲解了Django的MVT开发流程,本文重点对MVT中的模型(Model)进行重点讲解。
菜菜cc
2022/11/15
1.1K0
django models.py(python和django)
模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。
全栈程序员站长
2022/07/29
1.1K0
django models.py(python和django)
python测试开发django-78.ORM查询之extra
Django 的查询语法难以简单的表达复杂的 WHERE 子句,对于对于这种情况, Django 提供了 extra() 方法。 extra() 能在 QuerySet 生成的SQL从句中注入新子句,这样可以完成复制的查询。
上海-悠悠
2020/07/07
1.1K0
Django 使用 ORM 操作数据库详解
在python中的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率。
白墨石
2021/01/12
8420
django-rest-framework框架学习
现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式。前后端分离方式有许多好处,比如 1、可以前后端并行开发,提高开发效率 2、页面都在客户端进行渲染,提高了渲染速度,减小了服务器的压力 3、一套api提供给多个客户端使用,而且不限制客户端的类型(web,app均可)
earthchen
2020/09/24
1.3K0
python测试开发django-38.ManyToMany查询
同步之后数据库里面会新增三张表:student、teacher、student_teachers
上海-悠悠
2019/05/06
7600
python测试开发django-38.ManyToMany查询
用人话讲解django之ORM的查询语句
在日常开发中,数据库的增删改查(CDUR)中,查询需求偏多,所以查询的语法比增删改操作多得多,尤其是跨表关联查询,可以让代码精简很多。
用户4945346
2020/06/16
5000
Django之模型层(多表操作)
  一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方,即我们要把外键写在book类。
py3study
2020/01/19
6320
Python Day16 Django
django-admin startproject 项目名 在项目名目录下创建应用 python manage.py startapp blog 在project/settings.py中加入app
py3study
2020/01/10
2K0
Python Day16 Django
Django DjangoFilterBackend django-filter
注意 : 在url的参数中,原来我们在filters.py中定义的变量是 “RegDate”,到了url中变成了 “RegDate_after” 和 “RegDate_before”,这是框架给我设定好的区间变量,直接使用就行
Autooooooo
2020/11/09
1.6K0
Django DjangoFilterBackend django-filter
Django知识点
一、Django pip3 install django C:\Python35\Scripts # 创建Django工程 django-admin startproject 【工程名称】 mysite - mysite # 对整个程序进行配置 - init - settings # 配置文件
院长技术
2021/02/19
8560
06.Django基础五之django模型层(二)多表操作
    一对一、多对一、多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束。
changxin7
2019/09/29
2.8K0
【Django】 开发:数据库操作和后台管理
与 all () 方法不同,它会用 SQL 语句的 ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
杨丝儿
2022/02/24
4.1K0
相关推荐
Django 之 Models(Models 模型 & 数据表关系)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验