models & QuerySet API

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;

 
View Code

定义数据库表结构  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
vim models.py

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

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

猜你喜欢

转载自www.cnblogs.com/xiaobaozi-95/p/10180898.html
今日推荐