自定义第三张表的好处:可以定义多个字段,

缺点:查询不方便(有方法解决)

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'])

随机推荐

  1. ES学习之分片路由

    本文主要内容: 1.路由一个文档到一个分片 2.新建.索引和删除请求 3.取回单个文档 4.局部单个文档 5.多文档模式 6.理解一下ES深度分页(from-size)的劣势 路由一个文档到一个分片 ...

  2. Idea构建maven项目

    Idea构建maven项目: 步骤一: 步骤二: 自动导入Maven项目: 步骤三:增加web 二:搭建spring项目结构: 结构图: 网上都是一大堆的:自己也可以去搜:ssm  pom.xml  ...

  3. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  4. 059、安装配置flannel(2019-03-28 周四)

    参考https://www.cnblogs.com/CloudMan6/p/7424858.html   build flannel   flannel 没哟现成的执行文件可用,必须自己build,最 ...

  5. SpringBoot系列: 理解 Spring 的依赖注入(一)

    ==============================Spring 的依赖注入==============================对于 Spring 程序, Spring 框架为我们提供 ...

  6. mysql插入记录INSERT与多表更新

    1.第一种:INSERT [INTO] tbl_name[ (col_name, ... ) ]  {VALUES | VALUE}({expr |default}, ... ), (...), .. ...

  7. 第26月第7天 mac如何matplotlib中文乱码问题

    1.mac如何matplotlib中文乱码问题 先查看 ~/.matplotlib/fontList.json 添加SimHei字体(simhei.ttf文件)到 /Library/Framework ...

  8. python笔记---数据基础类型

    s = 'laonanHai' s1 = s.capitalize() #首字母大写,其他字母小写 s2 = s.upper() #全部大写 s3 = s.lower() #全部小写 print(s, ...

  9. Content-disposition中Attachment和inline的区别

    1.Content-disposition中Attachment和inline的区别java web中下载文件时,我们一般设置Content-Disposition告诉浏览器下载文件的名称,是否在浏览 ...

  10. MySql 在cmd下的学习笔记 —— 有关储存过程的操作(procedure)

    我们把若干条sql封装取来,起个名字------把此过程存储在数据库中叫存储过程 调用procedure 储存过程是可以变成的,意味着可以使用变量,表达式,控制结构 来完成复杂的功能 声明变量 pro ...