1.创建表
首先我们在model.py中定义这样的两个Model,对应两张表。
注意,Django会为我们的外键字段自动增加"_id",比如Student类有一个"country_id"字段,在数据库里会自动生成"country_id_id"字段,通过db_column指定字段名,可以避免以上这种情况。
# 国家表
class Country(models.Model):
name = models.CharField(max_length=100)
# 学生表, country 字段是国家表的外键,形成一对多的关系
class Student(models.Model):
name = models.CharField(max_length=100)
grade = models.PositiveSmallIntegerField()
country_id = models.ForeignKey(Country,
on_delete=models.PROTECT,
db_column='country_id')
然后执行如下语句,使定义生效到数据库中。
python manage.py makemigrations common
python manage.py migrate
在命令行中执行 python manage.py shell
,直接启动Django命令行,输入如下代码创建数据。
from common.models import *
c1 = Country.objects.create(name='中国')
c2 = Country.objects.create(name='美国')
c3 = Country.objects.create(name='法国')
Student.objects.create(name='白月', grade=1, country=c1)
Student.objects.create(name='黑羽', grade=2, country=c1)
Student.objects.create(name='大罗', grade=1, country=c1)
Student.objects.create(name='真佛', grade=2, country=c1)
Student.objects.create(name='Mike', grade=1, country=c2)
Student.objects.create(name='Gus', grade=1, country=c2)
Student.objects.create(name='White', grade=2, country=c2)
Student.objects.create(name='Napolen', grade=2, country=c3)
查看数据库,
2. 查询
2.1.get和filter区别
查询数据最常用的方法是get和filter,他们有一些不同:
-
输入参数
get 的参数只能是 model 中定义的那些字段,只支持严格匹配
filter 的参数可以是字段,也可以是扩展的 where 查询关键字,如 in,like 等 -
返回值
get 返回值是一个定义的 model 对象
filter 返回值是一个新的 QuerySet 对象,可以对 QuerySet 再次查询返回新的 QuerySet 对象,支持链式操作 -
异常
get 只有一条记录返回的时候才正常。说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或没有记录时都会抛出异常。
filter 有没有匹配的记录都可以。
2.2 filter的value条件
values方法可以获取number字段的字典列表。
values_list可以获取number的元组列表。
values_list方法加个参数flat=True可以获取number的某列值列表。
2.3 使用filter
为了方便理解,我们把Student这样存在外键的表称为主表,Country这样的表称为外表。
1. 在主表中筛选字段
主表名.objects.filter(主表字段,外键字段名__外表字段).values()
筛选一年级的中国学生信息:
Student.objects.filter(grade=1,country_id__name='中国').values()
2. 在外表中筛选字段
外表名.objects.filter(外表字段,主表名(小写)__主表字段).values()
筛选一年级的中国学生的ID和国家名
2.4 使用get
通过Model
名转化为小写,后面加上一个 _set
来获取所有的反向外键关联对象。注:该方法只能实现外表查主表,且只能获取主表字段。能用get实现的查询用filter也能实现。
外表名.objects.get(外表字段筛选条件).主表名(小写)_set.all().values()
查询中国学生的信息。
Country.objects.get(name='中国').student_set.all().values()
Country.objects.get(name='中国').student_set.all().values(‘name’,'country_id')
2.5 高级查询
1.获取个数 count
2.范围查询
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__contains 包含 忽略大小写 like ‘%aaa%’
__gt 大于 __gte 大于等于
__lt 小于 __lte 小于等于
__in 存在于一个list范围内
__range 在…范围内
__year 年 __month 月份 __day日
__isnull=True/False
3.排序 order_by
3.增加
4.删除
在筛选完成后delete
5.更新
在筛选完成后update(字段=新值)