Django(七)

外键字段的增删改查

前期数据表准备

以图书 出版社 作者 作者详情表为例

1. 针对一对多,一对一

增加数据,增加一本书

models.Book.objects.create(title='西游记', price=100, publish_time='2022-02-01', publish_id=1)

先查询出你要添加的出版社对象

publish_obj = models.Publish.objects.filter(pk=2).first()

models.Book.objects.create(title='西游记1', price=100, publish_time='2022-02-01', publish=publish_obj)

第二种方式

book_obj = models.Publish.objects.filter(pk=2).first()

book_obj.publish.add(1)

2. 改

models.Book.objects.filter(pk=1).update(publish_id=2)

book_obj = models.Book.objects.filter(pk=1).first()

print(book_obj.publish)

publish_obj = models.Publish.objects.filter(pk=1).first()

models.Book.objects.filter(pk=1).update(publish=publish_obj)

针对多对多

给一本书添加多个作者

book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj.authors) # app01.Author.None
# print(book_obj.authors.all()) # app01.Author.None
# 增加
# book_obj.authors # 代表已经到第三张表了
# book_obj.authors.add(1)

支持对象

author_obj1 = models.Author.objects.filter(pk=1).first()

author_obj2 = models.Author.objects.filter(pk=2).first()

book_obj.authors.add(1, 2)

book_obj.authors.add(author_obj1, author_obj2)

book_obj.authors.set([3, 2])

book_obj.authors.set([author_obj1, author_obj2])

删除

book_obj.authors.remove(2)

清空

book_obj.authors.clear()

正反向查询

正向查询
反向查询
'''
外键字段在我手上,我查你就是正向
外键字段不再我手上,我查你就是反向
'''
eg:
book >>> publish # 正向
publish >>> book # 反向
author >>> book # 反向
book >>> author # 正向

在多表查询的时候,按照正反向查询口诀
'''
1. 正向查询按照字段(外键字段)
2. 反向查询按照表名小写或者表名小写_set.all()
'''

基于对象的跨表查询(子查询)

###############################跨表查询###########################################
# 1.
# 查询书籍主键为1的出版社
# 书 >>> 出版社 >>> 正向
# book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj)
# print(book_obj.publish) # 代表的是出版社对象
# print(book_obj.publish.name)
# print(book_obj.publish.addr)

2.

查询书籍主键位1的作者

book >>> author >>> 正向

book_obj = models.Book.objects.filter(pk=1).first()

print(book_obj.authors) # app01.Author.None

print(book_obj.authors.all()) # app01.Author.None

for author_obj in book_obj.authors.all():

print(author_obj.name)

3.

查询tom的手机号

作者 >>> 作者详情 >>> 正向

author_obj = models.Author.objects.filter(name='tom').first()

print(author_obj.author_detail)

print(author_obj.author_detail.phone)

4.

查询东京出版社出版的书籍

出版社查书 >>> 反向

publish_obj = models.Publish.objects.filter(name='东京出版社').first()

print(publish_obj.book_set) # app01.Book.None

print(publish_obj.book_set.all()) # app01.Book.None

for book_obj in publish_obj.book_set.all():

print(book_obj.title)

5.

查询tom写过的书

作者查书 >>> 反向

author_obj = models.Author.objects.filter(name='tom').first()
print(author_obj.book_set.all())

6.

查询手机号是120的作者姓名

作者详情查作者信息 >>> 反向

author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first()
print(author_detail_obj.author) #

'''
总结:
反向查询只要查询出的结果可能有多个的时候,都要加上 表名_set.all()
如果查询出来的结果是一个,就不用加_set,直接使用表名小写

'''

基于双下划线的跨表查询

1.

查询书籍主键为1的出版社名称和书籍名称

'''
正反向查询的概念同样适用
'''
# res = models.Book.objects.filter(pk=1).values('title', 'publish__name')
# print(res)

2.

查询书籍主键位1的作者名称

res = models.Book.objects.filter(pk=1).values('authors__name')

print(res)

3.

查询tom的手机号

res = models.Author.objects.filter(name='tom').values('author_detail__phone')

print(res)

4.

查询东京出版社出版的书籍

res = models.Publish.objects.filter(name='东京出版社').values('book__title')

print(res)

5.

查询tom写过的书

res = models.Author.objects.filter(name='tom').values('book__title')

print(res)

6.

查询手机号是120的作者姓名

res = models.AuthorDetail.objects.filter(phone=120).values('author__name')

print(res)

7.

查询书籍主键位1的作者的手机号

book author author_detail

res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
print(res)

F查询和Q查询

F查询

可以拿到数据库中原有的数据
# 1. 把书籍的价格在原来的基础之上加100元
book
update book set price = price + 100 where id=1;

F查询

1. 把书籍的价格在原来的基础之上加100元

'''
一般来说,跟数据相关的模块要么在django.db,要么在django.db.models

'''
from django.db.models import F
''' F查询默认是对数字类型的'''
# models.Book.objects.update(price=F('price')+100)

from django.db.models.functions import Concat
from django.db.models import Value
# 2.
# models.Book.objects.update(title=Concat(F('title'), Value('东京出版社')))

Q查询

1. 查询书籍价格大于等于300的或者id=1的数据

sql: select * from t where price >= 300 or id=1

orm:

from django.db.models import Q
# res=models.Book.objects.filter(Q(price__gte=300), Q(id=1)) # 逗号分隔,还是and关系
# res=models.Book.objects.filter(Q(price__gte=300)| Q(id=1)) # |分隔,还是or关系
# res=models.Book.objects.filter(~Q(price__gte=300)| ~Q(id=1)) # ~分隔,取反
# print(res)
# q = 'price'

posted @ 2022-04-03 13:26  丶祈安  阅读(67)  评论(0)    收藏  举报