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': '3306', #端口,注意是字符串 'USER': 'root', #用户名 'PASSWORD': 'password' #密码 } } 要先创建mydb数据库: > create database mydb charset utf8;
定义数据库表结构 models.py
使用orm框架,不需要编写原生的sql语句
字段属性:https://docs.djangoproject.com/en/2.1/ref/models/fields/
from django.db import models class Person(models.Model): #一个类对应一张表 name = models.CharField(max_length=64) age = models.IntegerField() def __str__(self): # return self.name
创建表
# 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
查询数据
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 包含 <QuerySet [<Person: beibei>]> >>> Person.objects.filter(name__icontains='BEI') #icontains 包含,不区分大小写 <QuerySet [<Person: beibei>]> >>> Person.objects.filter(name__startswith='ja') #startswith <QuerySet [<Person: jack>]> >>> Person.objects.filter(name__endswith='ck') #endswith <QuerySet [<Person: jack>]> >>> Person.objects.filter(age__range=[20,30]) #range范围 <QuerySet [<Person: lily>, <Person: jack>, <Person: beibei>]> >>> Person.objects.filter(name__regex='^bei') #regex正则 <QuerySet [<Person: beibei>]>
get 返回与查找条件相匹配的一个对象
注意: 如果找到多个对象,则会报错:MultipleObjectsReturned
如果没有找到对象,则会报错:DoesNotExist
>>> Person.objects.get(name='jack') <Person: jack> >>> Person.objects.get(name='jack').name 'jack' >>> Person.objects.get(name='jack').age 28
修改数据
#修改一条数据 >>> 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
删除数据
>>> Person.objects.filter(name__contains='kang').delete() (1, {'app01.Person': 1}) #删除了一条数据
另一种方法:通过后台页面对数据进行增删改查
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
models.ForeignKey() python3里面需要加上on_delete参数,CASCADE:此值设置,是级联删除。否则会报错
生成数据表:
>python manage.py makemigrations formapp
>python manage.py migrate formapp # Django会自动创建一个中间连接表student_teacher来表示多对多关系
通过关联关系在命令行添加数据:
>>> from formapp.models import School,Teacher,Student >>> s=School(school_name='深大',city='深圳',website='www.shenda.com') >>> s.save() >>> School.objects.create(school_name='北大',city='北京',website='www.beida.com') <School: 北大> >>> Teacher.objects.bulk_create([Teacher(tname='老唐',gender='male'),Teacher(tname='老陈',gender='female')]) [<Teacher: 老唐>, <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='深圳')) >>> t2=Teacher.objects.get(tname='老陈') >>> S.save() #这里需要先保存,再add >>> 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'}]>
从数据库可以看到关联关系: