首页
学习
活动
专区
圈层
工具
发布

Django进阶-5-ORM连表查询

一、反向连表查询

① 通过object的形式反向连表

obj.小写表名_set.all()

代码语言:javascript
代码运行次数:0
复制
publish=models.Publish.objects.filter(name__contains='长沙').first()
books=publish.book_set.all()
  for book in books:
    print(book.title)

② 通过object的形式反向绑定外键关系

代码语言:javascript
代码运行次数:0
复制
authorobj = models.Author.objects.filter(id=1).first()
objects = models.Book.objects.all()
authorobj.book_set.add(*objects)
authorobj.save()

③ 通过values双下滑线的形式

objs.values("小写表名__字段")

注意对象集合调用values(),正向查询是外键字段__XX,而反向是小写表名__YY看起来

比较容易混淆;

代码语言:javascript
代码运行次数:0
复制
books=models.Publish.objects.filter(name__contains='湖南').values('name','book__title')
authors=models.Book.objects.filter(title__icontains='云团').values('author__name')
print(authors)
代码语言:javascript
代码运行次数:0
复制
 filter()也支持__小写表名语法进行连表查询:
代码语言:javascript
代码运行次数:0
复制
publishs=models.Publish.objects.filter(book__title='数据分析').values('name')
print(publishs)

二 、利用双下划线将字段和对应的操作连接起来

① 获取个数

代码语言:javascript
代码运行次数:0
复制
models.Tb1.objects.filter(name='seven').count()

② 大于,小于

代码语言:javascript
代码运行次数:0
复制
# 获取id大于1的值
models.Tb1.objects.filter(id__gt=1)
# 获取id大于等于1的值
models.Tb1.objects.filter(id__gte=1)
models.Tb1.objects.filter(id__lt=10)
# 获取id小于10的值
models.Tb1.objects.filter(id__lte=10)
# 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1)

③ in & isnull

代码语言:javascript
代码运行次数:0
复制
# 获取id等于11、22、33的数据
models.Tb1.objects.filter(id__in=[11, 22, 33])
# not in
models.Tb1.objects.exclude(id__in=[11, 22, 33])

# isnull
Entry.objects.filter(pub_date__isnull=True)

④ contains

代码语言:javascript
代码运行次数:0
复制
models.Tb1.objects.filter(name__contains="ven")
# icontains大小写不敏感
models.Tb1.objects.filter(name__icontains="ven")
models.Tb1.objects.exclude(name__icontains="ven")

⑤ range

代码语言:javascript
代码运行次数:0
复制
models.Tb1.objects.filter(id__range=[1, 2])
下一篇
举报
领券