$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'])
随机推荐
- [Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类
继续接上文: Android 使用 Greendao 操作 db sqlite(1)-- 直接在MainActivity中调用 布局文件同上文一致,这里就不贴了. 一.封装DaoUtils类 User ...
- HanLP中人名识别分析
HanLP中人名识别分析 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: 名字识别的问题 #387 机构名识别错误 关 ...
- 二.LinkedList原理及实现学习总结
一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...
- inetd的工作流程
- kindeditor编辑器上传图片
使用的是asp.net MVC 上传图片. 1.下载Kindeditor的对应的包 2.html页面 @{ Layout = null; } <!DOCTYPE html> <htm ...
- 利用openpyxl模块来操作Excel
python 读写 excel 有好多选择,但是,方便操作的库不多,在我尝试了几个库之后,我觉得两个比较方便的库分别是 xlrd/xlwt.openpyxl. 之所以推荐两个库是因为这两个库分别操作的 ...
- Spark思维导图之资源调度
- C#Windows 服务的安装说明
安装/卸载的步骤: 1 . .点击 开始,运行中输入cmd,获取命令提示符win7需要已管理员的身份启动,否则无法安装 2. 输入 : cd C:\Windows\Microsoft.NET\Fram ...
- Java基础_0303:封装性初步
class Book { // 定义一个新的类 private String title; // 书的名字 private double price; // 书的价格 public void getI ...
- gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
参考链接 : http://blog.csdn.net/qq_31108501/article/details/51842166 gcc -D选项的作用,声明宏 参考链接: http://blog. ...