Django ORM关联表增删改查

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(字段=新值)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值