$Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)
自定义第三张表的好处:可以定义多个字段,
缺点:查询不方便(有方法解决)
1.第三张表设置外键,联合唯一(查询不方便)
class Books(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
class Zuozhes(models.Model):
name=models.CharField(max_length=32)
sex=models.BooleanField()
# 第三张表
class b_z(models.Model):
book=models.ForeignKey(to='Books',to_field='id')
zuozhe=models.ForeignKey(to='Zuozhes',to_field='id')
class Meta:
unique_together=('book','zuozhe')
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dj23.settings")
import django
django.setup() from app01.models import *
# 添加书,作者,关联
a1=Books.objects.create(name='西游记2',price=30)
print(a1) #object
b1=Zuozhes.objects.create(name='lqz2',sex=True)
b2=Zuozhes.objects.create(name='egon2',sex=True)
b_z.objects.create(book=a1,zuozhe=b1)
b_z.objects.create(book=a1,zuozhe=b2)
# 跨表查询
# 查询书名为西游记的 作者名
b=Books.objects.filter(name='西游记')
b=[ i for i in b]
z=b_z.objects.filter(book__in=b)
z=[i.zuozhe_id for i in z]
g=Zuozhes.objects.filter(id__in=z).values('name')
print(g) #<QuerySet [{'name': 'lqz'}, {'name': 'egon'}]>
# 查询查询书名为西游记2的 作者名
u=Books.objects.filter(name='西游记2')
u=[i for i in u]
c=b_z.objects.filter(book__in=u).values('zuozhe__name')
print(c) #<QuerySet [{'zuozhe__name': 'lqz2'}, {'zuozhe__name':}]> 2.第三张表设置外键,联合唯一(查询方便)
class Books(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
zuo=models.ManyToManyField(to='Zuozhes',through='b_z',through_fields=('book','zuozhe'))
# 关联字段就是表名小写, 第一个值: 就是当前表的表名小写,顺序很重要
class Zuozhes(models.Model):
name=models.CharField(max_length=32)
sex=models.BooleanField()
# 第三张表
class b_z(models.Model):
book=models.ForeignKey(to='Books',to_field='id')
zuozhe=models.ForeignKey(to='Zuozhes',to_field='id')
class Meta:
unique_together=('book','zuozhe')
from app02 import models as m
# 添加书,作者,关联
n1=m.Books.objects.create(name='校花贴身高手',price=66)
n2=m.Books.objects.create(name='蛮荒',price=60)
v1=m.Zuozhes.objects.create(name='零一',sex=True)
v2=m.Zuozhes.objects.create(name='娥',sex=True)
v3=m.Zuozhes.objects.create(name='牧尘',sex=True)
v4=m.Zuozhes.objects.create(name='额',sex=True)
m.b_z.objects.create(book=n1,zuozhe=v1)
m.b_z.objects.create(book=n1,zuozhe=v2)
m.b_z.objects.create(book=n2,zuozhe=v3)
m.b_z.objects.create(book=n2,zuozhe=v4)
# 查询查询书名为校花贴身高手的作者名
b1=m.Books.objects.filter(name='校花贴身高手').values('zuo__name')
print(b1) #<QuerySet [{'zuo__name': '零一'}, {'zuo__name': '娥'}]>
b2=m.Books.objects.filter (name='校花贴身高手')
b2=[i.zuo for i in b2]
for i in b2:
print(i) #app02.Zuozhes.None
for z in i.all():
print(z.name) #零一 娥
# 查询查询书名为蛮荒的作者名
p=m.Zuozhes.objects.filter(books__name='蛮荒').values('name')
print(p) #<QuerySet [{'name': '牧尘'}, {'name': '额'}]>
基于双下划线跨表查询精髓:正向:book表查作者 内有zuozhe外键字段(按字段 查) Book.object.filter(zuozhe__name='xxx')
反向:zuozhe表查书 (按表名小写 查) Zuozhe.object.filter(book__name__in=['ooo','yyy'])
随机推荐
- Django-GET和POST小记
import requests requests.get(url='xxx') # 本质上就是: requests.request(method='get',url='xxx') import jso ...
- vivalidi 一款由Web技术诞生的Web浏览器
vivalidi https://vivaldi.com/ A million ways to customize everything The world is a colorful place b ...
- 使用aspectJ实现Spring AOP的两种方式
方式一:基于aspectJ的XML配置 方式二:基于aspectJ的注解方式 基于aspectJ的XML配置 1) 引入相关jar包 2) 创建Spring核心配置文件,必须导 ...
- python中的*和**的用途
def function_with_one_star(*t): print(t, type(t)) def function_with_two_stars(**d) print(d, ty ...
- 结构体类型struct
教学视频 定义: struct student{CString name; int num; TCHAR sex; int age; }; //注意有个分号 student zansan = {_ ...
- span i s等行内元素标签之间出现奇怪空格符号
上述展开信息本来是这样写的,但是很奇怪windows下的测试环境支付时间前面莫名其妙多了个小方框 <p> <span><i>收货人:</i>{remar ...
- windows基本命令大全
1.DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录. copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘. ...
- Linux环境及基础命令(一)
Linux环境及基础命令 一.认识Linux系统 略 二.配置Linux系统远程登录 2.1虚拟机系统配置 2.11虚拟机配置 统一NAT模式 虚拟机连不上 确定VMnet8网卡的IP地址(每台虚拟机 ...
- Python 16 html 基础 jQuery & Javascript研究
基础内容 DOM操作 javascript探讨 JQuery初识 DOM innerText ==>获取仅文本 innerHtml ==>获取全部内容 <div id=" ...
- 【CentOS】MySQL的安装
版本信息:CentOS 7.2 64位 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red ...