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

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

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. CentOS7 安装 Tomcat8

    安装 Java8准备更新软件yum update 如果提示没有 wget 命令,那么必须先安装 wget 如下:yum install wget 安装Tomcat8这里采用离线解压tar.gz的方式安 ...

  2. window跟vue变量互相绑定

    js实现变量监听 //定义一个对象,挂载到window下,后续在任何模块中,给这个对象的show属性赋值,都将触发set对应的代码,我这么写主要是为了解决vue子组件向父组件传值的问题 window. ...

  3. jquery 禁止滚动条滚动,并且滚动条不消失,页面大小不闪动

    一,禁止滚动,滚动条不消失,页面大小不闪动 //禁止滚动条滚动 function unScroll() { var top = $(document).scrollTop(); $(document) ...

  4. 【LeetCode】227. Basic Calculator

    Problem: Implement a basic calculator to evaluate a simple expression string. The expression string ...

  5. php serialize(),unserialize()

    序列化serialize()与反序列化unserialize(): 序列化serialize():就是将一个变量所代表的 “内存数据”转换为“字符串”的形式,并持久保存在硬盘(写入文件中保存)上的一种 ...

  6. es6解构赋值的高级技巧

    1. 解构嵌套的对象,注意,这时p是模式,不是变量,因此不会被赋值.如果p也要作为变量赋值,可以写成下面这样. let obj = { p: [ 'Hello', { y: 'World' } ] } ...

  7. linux 如何保持兼容性

    参考链接:   https://www.cnblogs.com/MYSQLZOUQI/p/5383594.html

  8. 库zlog的使用手册

    库官方网址: 使用手册:    http://hardysimpson.github.io/zlog/UsersGuide-CN.html#htoc11 [formats] simple = &quo ...

  9. Javascript - Jquery - 其它

    Ajax函数 $.ajax(url, type, success, error)//url:请求的页面路径//type:请求方式//success:请求成功的回调,该函数有两个参数:服务器返回数据(d ...

  10. 操作dom影响性能的原因

    为什么dom操作会影响性能? 在浏览器当中,dom的实现和ECMAScript的实现是分离的. 例如,在IE中,ECMAScrit的实现在jscript.dll中,而DOM的实现在mshtml.dll ...