django中配置mysql数据库

1,首先配置settings.py。

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

二是配置数据库相关信息

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01' #加上这一行,app名
]
DATABASES = { #配置数据库信息
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
"ENGINE": 'django.db.backends.mysql', #使用mysql数据库引擎
'NAME': 'mydb', #数据库名
'HOST': 'localhost', #ip
'PORT': '', #端口,注意是字符串
'USER': 'root', #用户名
'PASSWORD': 'password' #密码
}
}
要先创建mydb数据库: > create database mydb charset utf8;

定义数据库表结构  models.py

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

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/

class Person(models.Model):
name = models.CharField(max_length=64, unique=True)
age = models.IntegerField()
birthday = models.DateField()
gender_choices = ((u'male', '男'), (u'female', '女')) #二选一
gender = models.CharField(max_length=6, choices=gender_choices, default='male') #默认为male
blog_url = models.URLField(verbose_name="网址") #admin显示为网址
email = models.EmailField(help_text="写入一个类似123@qq.com的格式") #字段下方有提示
host = models.GenericIPAddressField(null=True, blank=True) #可以为空
def __str__(self):
return self.name
class Meta: #修改admin显示的表名
verbose_name_plural = '个人信息'

创建表

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

QeurySet API

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

创建数据

>python manage.py shell

>>> from app01.models import Person

#方法一:
>>> Person.objects.create(name='lily',age=20)
<Person: lily>
>>> Person.objects.create(name='jack',age=28)
<Person: jack>
#方法二: >>> p=Person(name='beibei',age=20)
>>> p.save()    #此方法需save保存生效
>>> p.name
'beibei'
>>> p.age
20

批量添加

>>> Person.objects.bulk_create([Person(tname='老唐',gender='male'),
Person(tname='老陈',gender='female')])
[<Person: 老唐>, <Person: 老陈>] # 批量添加

查询数据

all 获取所有对象列表

>>> 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  过滤,返回符合条件的一批对象,列表

>>> 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( ~ )

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  列表里面的元素是元祖

>>> 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  排除

models.Person.objects.filter(birthday__month=12).exclude(age__gt=12)
<QuerySet [<Person: 小陈>]>

oder_by 排序

>>> models.Person.objects.order_by('birthday')[0]  #排序完后取第一条

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

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

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

>>> Person.objects.get(name='jack')
<Person: jack>
>>> Person.objects.get(name='jack').name
'jack'
>>> Person.objects.get(name='jack').age
28

聚合 aggregate

>>> 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

修改数据

#修改一条数据
>>> 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

>>> from django.db.models import F
  >>> Student.objects.update(age=F('age')+10)  # age统一+10
  3

删除数据

>>> 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

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

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

from django.db import models

# Create your models here.
class School(models.Model):
school_name = models.CharField(max_length=64,unique=True)
city = models.CharField(max_length=64)
website = models.URLField()
def __str__(self):
return self.school_name
class Teacher(models.Model):
tname = models.CharField(max_length=64)
gender = models.CharField(max_length=32)
def __str__(self):
return self.tname
class Student(models.Model):
sname = models.CharField(max_length=64)
age = models.IntegerField()
teacher = models.ManyToManyField(Teacher) #跟老师多对多
school = models.ForeignKey(School,on_delete=models.CASCADE) #跟学校,多对一
def __str__(self):
return self.sname

vim models.py

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

生成数据表:

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

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

#添加学生
#方法一:
>>> 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类型

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的学生对象。

>>> s=models.School.objects.get(school_name='深大')
>>> s.delete()
(4, {'formapp.Student_teacher': 1, 'formapp.Student': 2, 'formapp.School': 1})

ManyToMany类型

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': ''}]>

 删除数据:

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

>>> t = models.Teacher.objects.get(tname='老陈')
>>> t.delete()
(3, {'formapp.Student_teacher': 2, 'formapp.Teacher': 1})

 反向关联查询

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

>>> 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表

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: 小冬>]>

Django-models & QuerySet API的更多相关文章

  1. Django之queryset API

    1. QuerySet 创建对象的方法 >>> from blog.models import Blog >>> b = Blog(name='Beatles Bl ...

  2. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  3. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  4. Django之路:QuerySet API,后台和表单

    一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...

  5. [py]django强悍的数据库接口(QuerySet API)-增删改查

    django强悍的数据库接口(QuerySet API) 4种方法插入数据 获取某个对象 filter过滤符合条件的对象 filter过滤排除某条件的对象- 支持链式多重查询 没找到排序的 - 4种方 ...

  6. Django——Django中的QuerySet API 与ORM(对象关系映射)

    首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...

  7. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  8. Django(19)QuerySet API

    前言 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager ...

  9. Django编写RESTful API(四):认证和权限

    欢迎访问我的个人网站:www.comingnext.cn 前言: 按照前面几篇文章里那样做,使用Django编写RESTful API的基本功能已经像模像样了.我们可以通过不同的URL访问到不同的资源 ...

  10. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

随机推荐

  1. Java面试宝典(2018版)

    置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen ...

  2. git之commit

    面解释的话, 1.git commit -m用于提交暂存区的文件: 2.git commit -am用于提交跟踪过的文件. 要理解它们的区别,首先要明白git的文件状态变化周期,如下图所示 工作目录下 ...

  3. 棋盘游戏,dfs搜索

    问题描述 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆 ...

  4. setoolkit 制作钓鱼网页

    由于是在虚拟机下实验,仅做示范 下载地址 git clone https://github.com/trustedsec/social-engineer-toolkit/ 终端输入setoolkit启 ...

  5. html5 css多列布局

    p{    text-indent: 2em;    line-height: 2em;}h4{    -webkit-column-span:all;    background: green;   ...

  6. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  7. week1 - Python基础1 介绍、基本语法、流程控制

    知识内容: 1.python介绍 2.变量及输入输出 3.分支结构 4.循环结构 一.python介绍 Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发 ...

  8. 手把手教你如何安装Pycharm

    手把手教你如何安装Pycharm——靠谱的Pycharm安装详细教程     今天小编给大家分享如何在本机上下载和安装Pycharm,具体的教程如下: 1.首先去Pycharm官网,或者直接输入网址: ...

  9. Nginx处理请求的11个阶段(agentzh的Nginx 教程学习记录)

    Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite.preacc ...

  10. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165316

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165316 下载 我分别下载了kali-linux-2019.1-i386的镜像文件和kali-linux ...